解法一
根据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>() {@Overridepublic 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);}}
