每日一练 · 自定义字符串排序

82 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

一、题目描述:

给定两个字符串 order 和 s 。order 的所有单词都是 唯一 的,并且以前按照一些自定义的顺序排序。

对 s 的字符进行置换,使其与排序的 order 相匹配。更具体地说,如果在 order 中的字符 x 出现字符 y 之前,那么在排列后的字符串中, x 也应该出现在 y 之前。

返回 满足这个性质的 s 的任意排列 。

 

示例 1:

输入: order = "cba", s = "abcd" 输出: "cbad" 解释: “a”、“b”、“c”是按顺序出现的,所以“a”、“b”、“c”的顺序应该是“c”、“b”、“a”。 因为“d”不是按顺序出现的,所以它可以在返回的字符串中的任何位置。“dcba”、“cdba”、“cbda”也是有效的输出。 示例 2:

输入: order = "cbafg", s = "abcd" 输出: "cbad"  

提示:

1 <= order.length <= 26 1 <= s.length <= 200 order 和 s 由小写英文字母组成 order 中的所有字符都 不同

二、思路分析:

有一个原则就是,由于排序是不稳定排序,为了防止意外的交换,保证进行排序的部分都在order中出现过,因此将s划分成两部分。

  • 使用一个哈希将order中的字符与索引建立映射,索引的大小即表示字符的先后顺序
  • 遍历字符串,同时使用一个列表s中属于order的字符加到上面
  • 从列表中依次取出字符串并加到最终结果上

三、AC 代码:

class Solution {
    public static String customSortString(String order, String s) {
        Map<Character,Integer> map=new HashMap<>();
        for(int i=0;i<order.length();i++){
            map.put(order.charAt(i),i);
        }
        List<Character>temp=new ArrayList<>();
        List<Character> list=new ArrayList<>();
        for(char c:s.toCharArray()){
            if(map.containsKey(c)) list.add(c);
            else temp.add(c);
        }
        list.sort((a,b)->{
            return map.get(a)-map.get(b);
        });
        list.addAll(temp);
        StringBuilder builder=new StringBuilder();
        list.forEach(builder::append);
        return builder.toString();
    }
}


四、总结:

image.png

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐

希望对你有帮助

期待下次再见~

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注从你我做