LeetCode345—Reverse Vowels of a String
原题
Write a function that takes a string as input and reverse only the vowels of a string.
Example 1:
Given s = “hello”, return “holle”.Example 2:
Given s = “leetcode”, return “leotcede”.
分析
也是逆置字符串,只不过这些操作只对元音字符(a,e,i,o,u)操作,从上面的例子上来看,”hello”中的元音字母是’e’和’o’,提取出来后进行逆置顺序变成’o’和’e’,其他字符的位置不变。
考虑到之前做逆置字符串的时候是将字符串对应位置的字符进行交换,这题可以这么考虑:
1. 把所有的元音字符在字符串中出现的位置(索引)记录一下;
2. 按照逆置字符串的方法对上一步的索引向量对应的字符(即元音字母)进行操作。
代码
class Solution {
private:
void chrSwap(char &a, char &b)//交换
{
char tmp = a;
a = b;
b = tmp;
}
bool judgeVowels(vector<char> Vowels, char c)//判断字符是否是元音
{
return (find(Vowels.begin(), Vowels.end(), tolower(c))!=Vowels.end());
}
public:
string reverseVowels(string s) {
vector<char>Vowels = {'a','e','i','o','u'};//元音集合
vector<int>vowelsIndex;
for (int i = 0; i < s.size(); i++)
{
if (judgeVowels(Vowels, s[i]))
{
vowelsIndex.push_back(i);
}
}//生成元音字符索引集合
int left=0;
int right = vowelsIndex.size() - 1;
while (left < right)
{
//对集合中相应位置的字符进行操作
chrSwap(s[vowelsIndex[left++]], s[vowelsIndex[right--]]);
}
return s;
}
};