给定两个字符串 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”也是有效的输出。
示例 2:
输入: order = “cbafg”, s = “abcd”
输出: “cbad”
提示:
1 <= order.length <= 26
1 <= s.length <= 200
order 和 s 由小写英文字母组成
order 中的所有字符都 不同
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/custom-sort-string
(1)自定义排序
① 使用数组 map[0…25] 来表示 a~z 在 order 中的下标,下标越小,优先级越大;
② 使用字符数组 chs 保存 s 中的字符。需要注意的是,为了方便后续调用 API,并进行自定义排序,此处使用封装类 Character;
③ 根据 map 中存储的每个字符对应的优先级,使用 lambda 表达式对字符数组 chs 进行自定义排序;
④ 拼接数组 chs 中的所有字符,最后得到的字符串即为答案之一,将其返回即可。
//思路1————自定义排序
class Solution {
public String customSortString(String order, String s) {
int orderLen = order.length();
int sLen = s.length();
//map[0...25] 表示 a~z 在 order 中的下标,下标越小,优先级越大
int[] map = new int[26];
for (int i = 0; i < orderLen; i++) {
map[order.charAt(i) - 'a'] = i;
}
/*
字符数组 chs 保存 s 中的字符
此处使用封装类 Character,其目的在于方便后续调用 API,进行自定义排序
*/
Character[] chs = new Character[sLen];
for (int i = 0; i < sLen; i++) {
chs[i] = s.charAt(i);
}
//使用 lambda 表达式进行自定义排序
Arrays.sort(chs, (c1, c2) -> map[c1 - 'a'] - map[c2 - 'a']);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < sLen; i++) {
builder.append(chs[i]);
}
return builder.toString();
}
}