解答
使用双指针,一个指针从头向尾遍历,一个指针从尾到头遍历,当两个指针都遍历到元音字符时,交换这两个元音字符。
为了快速判断一个字符是不是元音字符,我们将全部元音字符添加到集合 HashSet 中,从而以 O(1) 的时间复杂度进行该操作。
#include <string>
#include <unordered_set>
using namespace std;
class Solution {
public:
string reverseVowels(string s) {
//集合HashSet缓存元音符
unordered_set<char> set{'a','e','i','o','u','A','E','I','O','U'};
//左右双指针
int left = 0;
int right = s.length()-1;
while (left<right)
{
int lc = set.count(s[left]);
int rc = set.count(s[right]);
if(lc>0&&rc>0)//左右均为元音符,交换
{
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
else if(lc>0&&rc==0)//右指针不指向元音符
{
right--;
}
else if(lc==0&&rc>0)//左指针不指向元音符
{
left++;
}
else //左右指针都不指向元音符
{
left++;
right--;
}
}
return s;
}
};