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 处理。