开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情
一 描述
给定两个字符串 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 中的所有字符都 不同
二 分析
有两个思路:
构造一个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();
}
}