刷题的日常-自定义字符串排序

96 阅读2分钟

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

刷题的日常-2022年12月5号

一天一题,保持脑子清爽

自定义字符串排序

来自leetcode的 791 题,题意如下:

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

理解题意

通过题意,我们可以将信息整理如下:

  • 题目给出两个字符串,其中 order 是指定的字符出现顺序
  • 第二个是需要排序的字符串
  • 要求我们将 s 字符串进行排序,将 s 中出现的字符按 order 中字符出现的字符顺序进行排序
  • 返回任意一种满足要求的字符串

做题思路

要进行排序,可以使用内置的API进行实现,但是我们必须指定规则,通过规则进行排序,步骤如下:

  • 开辟个保存排序规则的排序数组
  • 将order中出现的字符配置进数组中,出现的越晚,数字越大,这里取出现位置的索引
  • 将需要排序的字符存进集合中
  • 对集合进行排序,这里的排序规则取字符出现的顺序,越大排越后
  • 最后将数据放进字符串中
  • 返回结果即可

代码实现

代码实现如下:

public class Solution {
    public String customSortString(String order, String s) {
        int[] sort = new int[26];
        List<Character> result = new ArrayList<>(s.length());
        for (int i = 0; i < order.length(); i++) {
            sort[order.charAt(i) - 'a'] = i;
        }
        for (int i = 0; i < s.length(); i++) {
            result.add(s.charAt(i));
        }
        result.sort(Comparator.comparingInt(o -> sort[o - 'a']));
        StringBuilder sb = new StringBuilder();
        for (Character c : result) {
            sb.append(c);
        }
        return sb.toString();
    }
}

image.png