leetcode讲解--791. Custom Sort String

本文深入探讨了一种定制字符串排序算法的实现,该算法通过使用HashMap数据结构优化字符搜索过程,实现了对输入字符串T的高效排序,确保其字符顺序与预排序的字符串S相匹配。文章详细介绍了算法思路,包括如何分类字符、记录频率以及最终生成符合要求的排序字符串。

题目

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

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.

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:

  • 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.

题目地址

讲解

这道题刚开始一直思路挺混乱的,只知道一定得用HashMap来减少搜索字符的时间(遍历需要很多遍)。正确的思路是这样的:首先我们需要遍历一遍T,把其中的字符分为两类,一类是在S中有的,一类是在S中没有的。而且将它们出现的次数以HashMap这种数据结构记录下来。而这个分类的过程中,是需要搜索S的,所以我们要提前把S弄成一张哈希表,这样就不用遍历S很多遍了。最后我们遍历一遍S,按照顺序,将S中的元素又在mapT中的放到result中,同时放一个就remove一个缩小mapT的大小。然后再将剩下的mapT中的元素放到result中。

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值