解法一
根据S中各个字母出现的次数,定义字母优先级,然后进行自定义排序。
import java.util.Arrays;
import java.util.Comparator;
class Solution {
// 字母优先级,越小优先级越高
int[] priority = new int[26];
public String customSortString(String S, String T) {
int i;
for (i = 0; i < S.length(); ++i) {
priority[S.charAt(i) - 97] = i;
}
Comparator<Character> letterComparator = new Comparator<Character>() {
@Override
public int compare(Character o1, Character o2) {
return priority[o1 - 97] - priority[o2 - 97];
}
};
Character[] ans = new Character[T.length()];
for (i = 0; i < T.length(); ++i) {
ans[i] = new Character(T.charAt(i));
}
Arrays.sort(ans, letterComparator);
StringBuilder stringBuilder = new StringBuilder();
for (Character ch : ans) {
stringBuilder.append(ch);
}
return stringBuilder.toString();
}
}
解法二
统计字母出现次数,按照S中出现的次序填充,最后补上只在T中出现不再S中出现的字母。
import java.util.Arrays;
class Solution {
public String customSortString(String S, String T) {
// 统计字母出现次数
int[] count = new int[26];
int i;
for (i = 0; i < T.length(); ++i) {
++count[T.charAt(i) - 97];
}
char ans[] = new char[T.length()];
int len = 0;
char ch;
for (i = 0; i < S.length(); ++i) {
ch = S.charAt(i);
Arrays.fill(ans, len, len + count[ch - 97], ch);
len += count[ch - 97];
count[ch - 97] = 0;
}
for (i = 0; i < 26; ++i) {
if (count[i] != 0) {
Arrays.fill(ans, len, len + count[i], (char) (97 + i));
len += count[i];
}
}
return new String(ans);
}
}