自定义字符串排序

题目

给定两个字符串 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”也是有效的输出。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/custom-sort-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:自定义排序法

  • 解题思路:
    先算出每个字母的权重,然后自定义排序一下
public static String customSortString(String order, String s) {
        int[] orderPower= new int[26];
        int power=order.length();
        for (int i = 0; i < order.length(); i++) {
            orderPower[order.charAt(i)-'a']=power;
            power--;
        }
        Character[] arr = new Character[s.length()];
        for (int i = 0; i < s.length(); ++i) {
            arr[i] = s.charAt(i);
        }
        Arrays.sort(arr, new Comparator<Character>() {
            @Override
            public int compare(Character o1, Character o2) {
                return orderPower[o2-'a']-orderPower[o1-'a'];
            }
        });
        StringBuilder stringBuilder = new StringBuilder();
        for (Character c:
             arr) {
            stringBuilder.append(c);
        }
        return stringBuilder.toString();

    }

解法二:

  • 先根据排序字段把所有排序字段中的字排序输出,然后再循环一遍,把开始没输出的字段也输出了
    public static String customSortString2(String order, String s) {
        StringBuilder stringBuilder= new StringBuilder();
        boolean[] used= new boolean[s.length()];
        for (int i = 0; i<order.length() ; i++) {
            for (int j = 0; j < s.length(); j++) {
                if(s.charAt(j)==order.charAt(i))
                {
                    stringBuilder.append(s.charAt(j));
                    used[j]=true;
                }
            }
        }
        for (int j = 0; j < s.length(); j++) {
           if(!used[j])
           {
               stringBuilder.append(s.charAt(j));
           }
        }
        return stringBuilder.toString();
    }

解法三:哈希法

  • 解题思路:
    设置一个LinkedHashMap<Character,StringBuilder>。把排序字段插入,最后插入一个,非字母的字节。
    把输入字符串,插入这个哈希字典中。最后在遍历输出。
public static String customSortString3(String order, String s) {
        LinkedHashMap<Character,StringBuilder> linkedHashMap= new LinkedHashMap<>();
        for (int i = 0; i < order.length(); i++) {
            linkedHashMap.put(order.charAt(i),new StringBuilder());
        }
        linkedHashMap.put('-',new StringBuilder());
        for (int i = 0; i < s.length(); i++) {
            if (linkedHashMap.containsKey(s.charAt(i)))
            {
                linkedHashMap.get(s.charAt(i)).append(s.charAt(i));
            }
            else
            {
                linkedHashMap.get('-').append(s.charAt(i));
            }
        }
        StringBuilder rs= new StringBuilder();
        for (Character c:
                linkedHashMap.keySet()) {
            rs.append(linkedHashMap.get(c));
        }
        return rs.toString();
    }
posted @ 2022-11-13 14:46  花茶冰糖  阅读(38)  评论(0编辑  收藏  举报