0345. 反转字符串中的元音字母【简单】
1. 📝 题目描述
给你一个字符串 s,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 'a'、'e'、'i'、'o'、'u',且可能以大小写两种形式出现不止一次。
示例 1:
txt
输入:s = "IceCreAm"
输出:"AceCreIm"
解释:
s 中的元音是 ['I', 'e', 'e', 'A']。反转这些元音,s 变为 "AceCreIm".1
2
3
4
5
2
3
4
5
示例 2:
txt
输入:s = "leetcode"
输出:"leotcede"1
2
2
提示:
1 <= s.length <= 3 * 10^5s由可打印的 ASCII 字符组成
2. 🎯 s.1 - 双指针
js
/**
* @param {string} s
* @return {string}
*/
var reverseVowels = function (s) {
const vowels = new Set(['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'])
const arr = s.split('')
let left = 0
let right = arr.length - 1
while (left < right) {
// 从左找元音
while (left < right && !vowels.has(arr[left])) {
left++
}
// 从右找元音
while (left < right && !vowels.has(arr[right])) {
right--
}
// 交换元音字母
if (left < right) {
;[arr[left], arr[right]] = [arr[right], arr[left]]
left++
right--
}
}
return arr.join('')
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
- 时间复杂度:
,双指针遍历一次字符串 - 空间复杂度:
,需要将字符串转为数组
算法思路:
- 使用双指针从两端向中间移动
- 用 Set 存储所有元音字母(包括大小写)
left从左找元音,right从右找元音- 找到后交换两个元音字母,继续移动指针
- 由于 JavaScript 字符串不可变,需先转为数组操作