小鱼刷leetcode---791. 自定义字符串排序

63 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情

一 描述

791. 自定义字符串排序 - 力扣(LeetCode)

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

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 中的所有字符都 不同

二 分析

有两个思路:

构造一个Priority数组,字符的优先级设为order中出现的下标,其余的一律置为27,放在后面。

这相当于一个从字母序到自定义顺序的映射

直接统计str中各个字符出现的顺序,再按照order中的顺序写入,最后再检查还有哪些没有写入的字符

三 答案

映射到自定义顺序

class Solution {
    public String customSortString(String order, String str) {
        int[] priority = new int[26];
        Arrays.fill(priority, 27);
        for (int i = 0; i < order.length(); i++) {
            priority[order.charAt(i) - 'a'] = i;
        }
        Character[] chars = new Character[str.length()];
        for (int i = 0; i < str.length(); i++) {
            chars[i] = str.charAt(i);
        }
        // 真的有在排序
        Arrays.sort(chars, (c1, c2) -> priority[c1 - 'a'] - priority[c2 - 'a']);
        StringBuilder sb = new StringBuilder();
        for (Character c : chars)
            sb.append(c);
        return sb.toString();
    }
}

按顺序写入

class Solution {
    public String customSortString(String order, String str) {
        int[] count = new int[26];
        StringBuilder sb = new StringBuilder();
        for (int i= 0; i < str.length(); i++) {
            count[str.charAt(i) - 'a']++;
        }
        for (int i= 0; i < order.length(); i++) {
            char c = order.charAt(i);
            while (count[c - 'a'] > 0) {
                sb.append(c);
                count[c - 'a']--;
            }
        }
        for (char c = 'a'; c <= 'z'; c++) {
            while (count[c - 'a'] != 0) {
                sb.append(c);
                count[c - 'a']--;
            }
        }
        return sb.toString();
    }
}


四 参考

JAVA小白思路,利用StringBuilder - 自定义字符串排序 - 力扣(LeetCode)