反轉字符串中的元音字母
題目描述
- 題目
編寫一個函數,以字符串作爲輸入,反轉該字符串中的元音字母。
-
示例
-
示例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;
}
};
- 運行結果