Skip to content

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)

链接

345 国际版

345 中文版