开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情
快乐周六,今天是困难题,拜托~退而求其次吧
自定义字符串排序
该题出自力扣的791题 —— 自定义字符串排序【中等题】
审题
给定两个字符串 order 和 s 。order 的所有字母都是 唯一 的,并且以前按照一些自定义的顺序排序。 对 s 的字符进行置换,使其与排序的 order 相匹配。更具体地说,如果在 order 中的字符 x 出现字符 y 之前,那么在排列后的字符串中, x 也应该出现在 y 之前。 返回 满足这个性质的 s 的任意一种排列 。
- 该题的题目很长,但是理解以后其实并不复杂,就是给出两个字符串,字符串order是作为参照的字符串,字符串s是需要转换的字符串,s需要转换成order的顺序,并且返回转换后的字符串
- 那么需要定义一个StringBuilder出来,作为字符串拼接
-
定义一个HashMap作为记录字符串s的字符出现的频率与作为存储
-
循环字符串s,记录字符串,并且记录HashMap
-
循环参照字符串order
- 判断HashMap是否存在该字符串,存在则不断append进字符串
-
最后做一次兜底的循环,对HashMap的遍历,对order字符串不存在的字符进行补充进字符串
-
然后把字符串s 在 order 中出现的字符按照 order 中的顺序排序,添加到结果字符串中。最后把剩余的字符直接追加到结果字符串中。
-
编码
class Solution {
public String customSortString(String order, String s) {
StringBuilder sb = new StringBuilder();
HashMap<String,Integer> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
map.put(String.valueOf(s.charAt(i)),map.getOrDefault(String.valueOf(s.charAt(i)),0) + 1);
}
for (int i = 0; i < order.length(); i++) {
String s1 = String.valueOf(order.charAt(i));
if (map.containsKey(s1)){
Integer integer = map.get(s1);
while (integer != 0){
sb.append(s1);
integer--;
}
map.put(s1,0);
}
}
map.forEach((k,v) -> {
if (v !=0){
while (v !=0){
sb.append(k);
v--;
}
}
});
return sb.toString();
}
}