LeetCode 每日一题 345. 反转字符串中的元音字母

Published by rcdfrd on 2022-12-20

345. 反转字符串中的元音字母

难度简单

Given s = "leetcode", return "leotcede".

使用双指针,一个指针从头向尾遍历,一个指针从尾到头遍历,当两个指针都遍历到元音字符时,交换这两个元音字符。

为了快速判断一个字符是不是元音字符,我们将全部元音字符添加到集合 HashSet 中,从而以 O(1) 的时间复杂度进行该操作。

  • 时间复杂度为 O(N):只需要遍历所有元素一次
  • 空间复杂度 O(1):只需要使用两个额外变量

代码:

class Solution {
public:
    // #define print(x, y) cout << "line:" << __LINE__ << "\t" << x << " = " << y << endl
    #define print
    unordered_set<char> vowel = {'a','e','i','o','u','A','E','I','O','U'};
    string reverseVowels(string s) {
        for (int i = 0, j = s.size(); i < s.size(), i < j; i++, j--)
        {
            while(i < j && vowel.find(s[i]) == vowel.end()) i++;
            while(i < j && vowel.find(s[j]) == vowel.end()) j--;
            print('i', i);
            print('j', j);
            char t = s[i];
            s[i] = s[j];
            s[j] = t;
            print('s', s);
        }
        return s;
    }
};