思路一
正向遍历str一遍,用vector录入所有元音字母,再反向遍历str一遍,将vector中的字符正序填入str的元音字符位
#include<string>
#include<vector>
class Solution {
public:
string reverseVowels(string s) {
vector<char> vowels;
for(int i=0;i<s.size(); i++){
if(isVowel(s[i])){
vowels.push_back(s[i]);
}
}
vector<char>::iterator iter = vowels.begin();
for(int i=s.size()-1 ; i>= 0&& iter!=vowels.end() ; i--){
if(isVowel(s[i])){
s[i]=*iter;
iter++;
}
}
return s;
}
bool isVowel(char ch){
switch(ch){
case 'a':
case 'A':
case 'e':
case 'E':
case 'I':
case 'i':
case 'o':
case 'O':
case 'u':
case 'U':
return true;
default:
return false;
}
}
};
思路二
双指针,头尾同时遍历
class Solution {
public:
string reverseVowels(string s) {
int i = 0, j = s.size() - 1;
for (; i <= j; i++, j--) {
if (isVowel(s[i]) && isVowel(s[j])) {
char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
else if (isVowel(s[i])) {
--i;
}
else if (isVowel(s[j])) {
++j;
}
}
return s;
}
bool isVowel(char ch){
switch(ch){
case 'a':
case 'A':
case 'e':
case 'E':
case 'I':
case 'i':
case 'o':
case 'O':
case 'u':
case 'U':
return true;
default:
return false;
}
}
};
心得
这道题不难,我第一个想到的解法是思路一,用时4ms,看了评论才知道可以双指针,按理说双指针运行时间应该更少啊,可是我的用了8ms!比vector还慢,想不通。
判断元音字母要单独写一个函数没有问题,可我写的空间复杂度有点高了。
在评论和题解中学到几个简单的
bool isVowel(char ch){
return ch=='a'||ch=='A'||ch=='e'||ch=='E'||ch=='i'||ch=='I'||ch=='o'
||ch=='O'||ch=='u'||ch=='U';
}
还可以用字符串的find
方法
string vowels = "aeiouAEIOU";
if(vowels.find(ch)==-1) return false;
else return true;
这样也节省了搓代码的时间啊!