反转字符串中的元音字母
题目描述
- 题目
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
-
示例
-
示例1
输入: "hello" 输出: "holle"
-
示例 2:
输入: "leetcode" 输出: "leotcede"
解题
双端队列版本
- 首先想到的肯定是遍历整个字符串寻找字符串中的元音字母了
但是怎么完成元音字母的交换呢?
- 仔细观察,你会发现这个反转字符中的元音字母反转的对象都是在字串两端.
- 于是我想到了可以使用双端队列来存储字符串中的下标,只要从两端取,就能保证在反转对象的时候从双端队列双端取元素就能保证反转的正确性
- 遍历整个字符串把元音字母的下标尾插到双端队列中(遍历完毕后双端队列中便是按照字符串元音字符的顺序存放字符下标的)
- 若,双端队列中只有一个数字,那说明不需要对字符串中的元音字符进行反转,可直接返回该状态的字符串s
- 但是,当双端队列不为空且双端队列的长度不为1的情况下,咱们就需要从双端队列两端取字符串中元音字符的下标来完成反转了.
代码实现
class Solution {
public:
string reverseVowels(string s) {
if(s.empty())
return s;
deque<int> dq;
int left=0;
string str="aeiouAEIOU";
while(left<s.size()){
//遍历整个字符串,将元音字符的元素下标放到双端队列中
if(str.find(s[left]) != -1 && left<s.size()){
dq.push_back(left);
}
left++;
}
while(!dq.empty()){
if(dq.size()==1){
//若双端队列的长度为1,则不再需要反转
break;
}
int left=dq.front();
//取队首元素
dq.pop_front();
int right=dq.back();
//取队尾元素
dq.pop_back();
//将队首元素和队尾元素下标对应的元音字符进行交换
swap(s[left],s[right]);
}
return s;
}
};
- 运行结果
双指针版本
- 思路
- 这种方式还是根据该题目中特殊的反转条件(两个反转对象分别在字符串两端)
使用两个指针从字符串的两端开始遍历
当遇到符合条件的两个元音字符就进行交换
且不断更新两个指针的位置
代码实现
class Solution {
public:
string reverseVowels(string s) {
string str="aeiouAEIOU";
int left=0; //该变量从字符串的最左端开始遍历
int right=s.size()-1; //该变量中字符串的最右端开始遍历
while(left<right){
while(str.find(s[left])==-1 && left<right){
//只要不是元音字符就移动左指针
left++;
}
while(str.find(s[right]) ==-1 && left<right){
//不是元音字符就移动右指针
right--;
}
swap(s[left++],s[right--]);
//交换左右指针指向的元素
}
return s;
}
};
- 运行结果