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