算法日志 --- 12.10---自定义字符串排序

78 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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();
    }
}

image.png