Leetcode 2785. 將字符串中的元音字母排序
給你一個下標從 0 開始的字符串 s ,將 s 中的元素重新 排列 得到新的字符串 t ,它滿足:
- 所有輔音字母都在原來的位置上。更正式的,如果滿足 0 <= i < s.length 的下標 i 處的 s[i] 是個輔音字母,那么 t[i] = s[i] 。
- 元音字母都必須以他們的 ASCII 值按 非遞減 順序排列。更正式的,對于滿足 0 <= i < j < s.length 的下標 i 和 j ,如果 s[i] 和 s[j] 都是元音字母,那么 t[i] 的 ASCII 值不能大于 t[j] 的 ASCII 值。
請你返回結果字母串。
元音字母為 ‘a’ ,‘e’ ,‘i’ ,‘o’ 和 ‘u’ ,它們可能是小寫字母也可能是大寫字母,輔音字母是除了這 5 個字母以外的所有字母。

兩個 List,分別保存元音字母和元音字母的位置,而其中,原因字母是要排序的,而與元音字母的位置是不變的,將其排序后的位置,插入進入即可。
其中字符串是需要改變的,有兩種解決辦法:
- 使用可變的字符串對象:StringBuffer 或 StringBuilder,再不考慮多線程的情況下使用 StringBuilder,因為 StringBuffer 是線程安全的,但 StringBuilder 是線程不安全的,但 StringBuilder 效率更高。
- 使用字符數組進行處理
String.toCharArray()。
class Solution {public String sortVowels(String s) {int n = s.length();List<Character> chars = new ArrayList<>(); // 元音字母List<Integer> indexes = new ArrayList<>(); // 元音字母的位置char[] ss = s.toCharArray();for (int i = 0; i < n; i++) {char c = s.charAt(i);if (isVowel(c)) {chars.add(c);indexes.add(i);}}Collections.sort(chars);n = indexes.size();for (int i = 0; i < n; i++) {ss[indexes.get(i)] = chars.get(i);}return String.valueOf(ss);}public boolean isVowel(char c) {if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'|| c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') {return true;}return false;}
}
后記:
對于可變字符串的處理:
- 如果長度是確定的,可以考慮使用字符數組進行處理。
- 如果長度可變,且支持多線程,則使用 StringBuffer 處理。
- 如果長度可變,不需要支持多線程,則使用 StringBuildere 處理。