leetcode講解--791. Custom Sort String

題目

S and T are strings composed of lowercase letters. In S, no letter occurs more than once.java

S was sorted in some custom order previously. We want to permute the characters of T so that they match the order that S was sorted. More specifically, if x occurs before y in S, then x should occur before y in the returned string.數據結構

Return any permutation of T (as a string) that satisfies this property.app

Example :
Input: 
S = "cba"
T = "abcd"
Output: "cbad"
Explanation: 
"a", "b", "c" appear in S, so the order of "a", "b", "c" should be "c", "b", and "a". 
Since "d" does not appear in S, it can be at any position in T. "dcba", "cdba", "cbda" are also valid outputs.

Note:this

  • S has length at most 26, and no character is repeated in S.
  • T has length at most 200.
  • S and T consist of lowercase letters only.

題目地址code

講解

這道題剛開始一直思路挺混亂的,只知道必定得用HashMap來減小搜索字符的時間(遍歷須要不少遍)。正確的思路是這樣的:首先咱們須要遍歷一遍T,把其中的字符分爲兩類,一類是在S中有的,一類是在S中沒有的。並且將它們出現的次數以HashMap這種數據結構記錄下來。而這個分類的過程當中,是須要搜索S的,因此咱們要提早把S弄成一張哈希表,這樣就不用遍歷S不少遍了。最後咱們遍歷一遍S,按照順序,將S中的元素又在mapT中的放到result中,同時放一個就remove一個縮小mapT的大小。而後再將剩下的mapT中的元素放到result中。ci

Java代碼

class Solution {
    public String customSortString(String S, String T) {
        Map<Character, Integer> mapT = new HashMap<>();
        Set<Character> mapS = new HashSet<>();
        for(int i=0;i<S.length();i++){
            mapS.add(S.charAt(i));
        }
        for(int i=0;i<T.length();i++){
            Integer count= mapT.get(T.charAt(i));
            if(mapS.contains(T.charAt(i))){
                if(count==null){
                    mapT.put(T.charAt(i),1);
                }else{
                    mapT.put(T.charAt(i),count+1);
                }
            }else{
                if(count==null){
                    mapT.put(T.charAt(i),-1);
                }else{
                    mapT.put(T.charAt(i),count-1);
                }
            }
            
        }
        char[] result = new char[T.length()];
        int indexBegin=0;
        int indexEnd = T.length()-1;
        for(int i=0;i<S.length();i++){
            Integer count = mapT.get(S.charAt(i));
            if(count!=null){
                while(count>0){
                    result[indexBegin++] = S.charAt(i);
                    count--;
                }
                mapT.remove(S.charAt(i));
            }
        }
        for(Character c:mapT.keySet()){
            Integer count = mapT.get(c);
            while(count<0){
                result[indexEnd--] = c;
                count++;
            }
        }
        return String.valueOf(result);
    }
}
相關文章
相關標籤/搜索