持续创作,加速成长!这是我参与「掘金日新计划 · 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();
}
}
四、总结:
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐
希望对你有帮助
期待下次再见~
🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注从你我做