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);
    }
}
相关文章
相关标签/搜索