class Solution {
public:
string sortVowels(string s) {
}
};
6926. 将字符串中的元音字母排序
给你一个下标从 0 开始的字符串 s
,将 s
中的元素重新 排列 得到新的字符串 t
,它满足:
0 <= i < s.length
的下标 i
处的 s[i]
是个辅音字母,那么 t[i] = s[i]
。0 <= i < j < s.length
的下标 i
和 j
,如果 s[i]
和 s[j]
都是元音字母,那么 t[i]
的 ASCII 值不能大于 t[j]
的 ASCII 值。请你返回结果字母串。
元音字母为 'a'
,'e'
,'i'
,'o'
和 'u'
,它们可能是小写字母也可能是大写字母,辅音字母是除了这 5 个字母以外的所有字母。
示例 1:
输入:s = "lEetcOde" 输出:"lEOtcede" 解释:'E' ,'O' 和 'e' 是 s 中的元音字母,'l' ,'t' ,'c' 和 'd' 是所有的辅音。将元音字母按照 ASCII 值排序,辅音字母留在原地。
示例 2:
输入:s = "lYmpH" 输出:"lYmpH" 解释:s 中没有元音字母(s 中都为辅音字母),所以我们返回 "lYmpH" 。
提示:
1 <= s.length <= 105
s
只包含英语字母表中的 大写 和 小写 字母。原站题解
java 解法, 执行用时: 52 ms, 内存消耗: 44.4 MB, 提交时间: 2023-07-24 09:43:06
class Solution { public String sortVowels(String s) { char[] charArray = s.toCharArray(); String ss = "aeiouAEIOU"; List<Character> list = new ArrayList<>(); for (char c : s.toCharArray()) { // 元音字母抽取出来 if (ss.indexOf(c) != -1) { list.add(c); } } Collections.sort(list); // 元音字母按ascii排序 int j = 0; for (int i = 0; i < charArray.length; i++) { if (ss.indexOf(charArray[i]) != -1) { charArray[i] = list.get(j++); // 将元音位填充回去 } } return new String(charArray); } }
cpp 解法, 执行用时: 40 ms, 内存消耗: 11.6 MB, 提交时间: 2023-07-24 09:41:57
class Solution { public: string sortVowels(string s) { // 判断是不是元音 auto check = [](char c) { return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U'; }; // 把元音都抽出来放进 vector 里并排序 vector<char> vec; for (char c : s) if (check(c)) vec.push_back(c); sort(vec.begin(), vec.end()); // 把排序后的元音放回去 int n = s.size(); for (int i = n - 1; i >= 0; i--) if (check(s[i])) s[i] = vec.back(), vec.pop_back(); return s; } };
python3 解法, 执行用时: 148 ms, 内存消耗: 19 MB, 提交时间: 2023-07-24 09:40:57
class Solution: def sortVowels(self, s: str) -> str: s1 = sorted([c for c in s if c in "AEIOUaeiou"], reverse = True) return ''.join(s1.pop() if c in "AEIOUaeiou" else c for c in s)
golang 解法, 执行用时: 16 ms, 内存消耗: 6.4 MB, 提交时间: 2023-07-24 09:40:12
func sortVowels(s string) string { a := []byte{} for _, c := range s { if 2130466>>(c&31)&1 > 0 { // 判断是否元音字母 a = append(a, byte(c)) } } sort.Slice(a, func(i, j int) bool { return a[i] < a[j] }) // 元音字母排序 t, j := []byte(s), 0 for i, c := range t { if 2130466>>(c&31)&1 > 0 { t[i] = a[j] j++ } } return string(t) }
python3 解法, 执行用时: 140 ms, 内存消耗: 18.6 MB, 提交时间: 2023-07-24 09:36:41
class Solution: def sortVowels(self, s: str) -> str: a = sorted(c for c in s if c in "aeiouAEIOU") # 元音字母按ascii排序 t = list(s) j = 0 for i, c in enumerate(t): if c in "aeiouAEIOU": t[i] = a[j] # 元音位重新填充 j += 1 return ''.join(t)