345. 反转字符串中的元音字母 Easy
给你一个字符串 s
,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 'a'、'e'、'i'、'o'、'u',且可能以大小写两种形式出现不止一次。
示例 1:
输入:s = "IceCreAm"
输出:"AceCreIm"
解释:s 中的元音是 ['I', 'e', 'e', 'A']。反转这些元音,s 变为 "AceCreIm"
示例 2:
输入:s = "leetcode"
输出:"leotcede"
解题思路
输入: 一个字符串 s
输出: 反转字符串中的元音字母,返回结果字符串
这是一个 字符串遍历 问题。
我们将字符串转成数组存储起来
利用双指针遍历字符串,遇到元音字符停下来,交换数组中对应的字符,继续向中间遍历
最后左右指针相交后说明反转完毕
代码实现
python
class Solution:
def reverseVowels(self, s: str) -> str:
# 定义元音字母的集合,包含大小写元音字母
vowels = set('aeiouAEIOU')
# 初始化左右指针
l, r = 0, len(s) - 1
# 将字符串转换为列表,方便修改
ans = list(s)
# 使用双指针法,左右指针向中间移动
while l < r:
# 左指针移动到元音字符的位置
while l < r and s[l] not in vowels:
l += 1
# 右指针移动到元音字符的位置
while l < r and s[r] not in vowels:
r -= 1
# 交换左右指针处的元音字符
ans[l], ans[r] = ans[r], ans[l]
# 左指针右移,右指针左移,继续查找下一个元音字符
l += 1
r -= 1
# 最后将列表转换回字符串并返回
return ''.join(ans)
javascript
var reverseVowels = function(s) {
let left = 0;
let right = s.length - 1;
// 定义元音集合,方便 O(1) 查找
const vowels = new Set(['a','e','i','o','u','A','E','I','O','U']);
// 转成数组方便原地修改
const chars = s.split('');
// 双指针向中间靠拢
while (left < right) {
// 左指针右移,直到遇到元音
while (left < right && !vowels.has(chars[left])) left++;
// 右指针左移,直到遇到元音
while (left < right && !vowels.has(chars[right])) right--;
// 交换两个元音
[chars[left], chars[right]] = [chars[right], chars[left]];
// 移动指针
left++;
right--;
}
// 拼接成字符串返回
return chars.join('');
};
复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)