解法一

根据S中各个字母出现的次数,定义字母优先级,然后进行自定义排序。

  1. import java.util.Arrays;
  2. import java.util.Comparator;
  3. class Solution {
  4. // 字母优先级,越小优先级越高
  5. int[] priority = new int[26];
  6. public String customSortString(String S, String T) {
  7. int i;
  8. for (i = 0; i < S.length(); ++i) {
  9. priority[S.charAt(i) - 97] = i;
  10. }
  11. Comparator<Character> letterComparator = new Comparator<Character>() {
  12. @Override
  13. public int compare(Character o1, Character o2) {
  14. return priority[o1 - 97] - priority[o2 - 97];
  15. }
  16. };
  17. Character[] ans = new Character[T.length()];
  18. for (i = 0; i < T.length(); ++i) {
  19. ans[i] = new Character(T.charAt(i));
  20. }
  21. Arrays.sort(ans, letterComparator);
  22. StringBuilder stringBuilder = new StringBuilder();
  23. for (Character ch : ans) {
  24. stringBuilder.append(ch);
  25. }
  26. return stringBuilder.toString();
  27. }
  28. }

解法二

统计字母出现次数,按照S中出现的次序填充,最后补上只在T中出现不再S中出现的字母。

  1. import java.util.Arrays;
  2. class Solution {
  3. public String customSortString(String S, String T) {
  4. // 统计字母出现次数
  5. int[] count = new int[26];
  6. int i;
  7. for (i = 0; i < T.length(); ++i) {
  8. ++count[T.charAt(i) - 97];
  9. }
  10. char ans[] = new char[T.length()];
  11. int len = 0;
  12. char ch;
  13. for (i = 0; i < S.length(); ++i) {
  14. ch = S.charAt(i);
  15. Arrays.fill(ans, len, len + count[ch - 97], ch);
  16. len += count[ch - 97];
  17. count[ch - 97] = 0;
  18. }
  19. for (i = 0; i < 26; ++i) {
  20. if (count[i] != 0) {
  21. Arrays.fill(ans, len, len + count[i], (char) (97 + i));
  22. len += count[i];
  23. }
  24. }
  25. return new String(ans);
  26. }
  27. }