C++實現(xiàn)字符串元音字母反轉(zhuǎn)的兩種方法
C++實現(xiàn)字符串元音字母反轉(zhuǎn)的巧妙方法
在處理字符串問題時,我們經(jīng)常需要對其中的字符進行操作,例如反轉(zhuǎn)、替換等。本文將詳細討論如何在C++中實現(xiàn)僅反轉(zhuǎn)字符串中的所有元音字母,并返回結(jié)果字符串。元音字母包括’a’、‘e’、‘i’、‘o’、‘u’,且可能以大小寫兩種形式出現(xiàn)不止一次。我們將介紹兩種方法:利用數(shù)據(jù)結(jié)構(gòu)和雙指針算法。
示例
- 輸入:s = “hello”
輸出:“holle” - 輸入:s = “leetcode”
輸出:“leotcede”
方法一:利用數(shù)據(jù)結(jié)構(gòu)存儲元音位置和字符并反轉(zhuǎn)
代碼實現(xiàn)
class Solution { public: string reverseVowels(string s) { vector<pair<int, char>> yuan; // 設置一個集合裝元音字母,然后一個個判斷,如果是直接放入yuan,然后再倒序 set<char> vowels = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'}; for(int i = 0; i < s.size(); i++) { if(vowels.find(s[i]) != vowels.end()) { yuan.push_back({i, s[i]}); } } reverse(yuan.begin(), yuan.end()); for(int i = 0; i < yuan.size(); i++) { s[yuan[i].first] = yuan[yuan.size() - 1 - i].second; } return s; } };
1. 如何在C++中存儲數(shù)字和字符并支持翻轉(zhuǎn)
在C++中,可以使用vector<pair<int, char>>
來同時存儲數(shù)字和字符。vector
是一個動態(tài)數(shù)組,可以支持反轉(zhuǎn)操作。如下所示:
vector<pair<int, char>> yuan; yuan.push_back({index, character}); reverse(yuan.begin(), yuan.end());
2. 判斷字符是否在列表中
在判斷一個字符是否在列表中時,使用set
的find
方法雖然簡潔。
if(vowels.find(s[i]) != vowels.end())
但由于set
的查找復雜度為O(log n),對于小規(guī)模查找來說,直接使用特判方法效率更高,如下所示:
bool isVowel(char c) { return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U'; }
使用set_find
操作
使用特判
3. 巧妙的反轉(zhuǎn)操作
使用vector<pair<int, char>>
存儲元音字符及其索引,并進行反轉(zhuǎn):
for(int i = 0; i < yuan.size(); i++) { s[yuan[i].first] = yuan[yuan.size() - 1 - i].second; }
這個方法減少了對原始字符串的迭代次數(shù),只需處理元音字符的數(shù)量,而不是整個字符串。
方法二:雙指針法
雙指針法是一種高效的解決方案。在需要反轉(zhuǎn)字符串中的部分字符時,通過從兩端向中間移動指針來找到需要交換的字符,避免了額外的空間開銷。
代碼實現(xiàn)
class Solution { public: string reverseVowels(string s) { int i = 0, j = s.size() - 1; while (i < j) { if (!isVowel(s[i])) { i++; } else if (!isVowel(s[j])) { j--; } else { swap(s[i], s[j]); i++; j--; } } return s; } bool isVowel(char c) { return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U'; } };
雙指針法核心思路
雙指針法是一種簡潔高效的解決方案,通過在字符串兩端同時移動指針來實現(xiàn)反轉(zhuǎn)操作。以下是詳細步驟:
初始化指針:
i
指向字符串開頭。j
指向字符串結(jié)尾。
移動指針并交換元音:
- 當指針
i
和j
未相遇時,繼續(xù)執(zhí)行循環(huán)。 - 如果
i
指向的字符不是元音,i
右移。 - 如果
j
指向的字符不是元音,j
左移。 - 如果
i
和j
指向的字符都是元音,則交換這兩個字符,并分別移動指針i
和j
。
優(yōu)點
空間復雜度低:雙指針法在原地反轉(zhuǎn)元音字符,不需要額外的存儲空間。時間復雜度低:該方法僅需一次遍歷,時間復雜度為O(n),其中n是字符串的長度。
總結(jié)
在處理字符串元音反轉(zhuǎn)的問題時,利用數(shù)據(jù)結(jié)構(gòu)和雙指針法都是有效的解決方案。數(shù)據(jù)結(jié)構(gòu)方法通過存儲元音的位置和字符來實現(xiàn)反轉(zhuǎn),而雙指針法通過兩端同時向中間移動指針來找到需要交換的字符。這兩種方法各有優(yōu)劣,具體選擇取決于問題的規(guī)模和對空間復雜度的要求。
以上就是C++實現(xiàn)字符串元音字母反轉(zhuǎn)的兩種方法的詳細內(nèi)容,更多關于C++元音字母反轉(zhuǎn)的資料請關注腳本之家其它相關文章!
相關文章
C/C++之long int與long long的區(qū)別及說明
這篇文章主要介紹了C/C++之long int與long long的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08