一、 題目
給出一個字符串,以單詞為單位反轉字符串。
例如 i am echo
返回 echo am i
二、 分析
仔細分析會發現,對於中間結果我們需要保存,即我們得保證以單詞為單位。另外我們需要考慮到下面的情況
1、中間有多個空格的處理
2、沒有空格的字符串
3、反轉後開頭和結尾不能有空格
4、最後的結果單詞間得有空格
所以,由以上我們有兩種思路,一種就是以單詞為單位反轉,這個需要用到vector,reverse即可,需要兩次for循環,如下:
class Solution { public: void reverseWords(string &s) { vectordes; if(s.empty()) return; int len = s.size(); for(int i = 0; i < len; i++){ if(s[i] == ' ') continue; string word; while(i < len && s[i] != ' '){ word += s[i]; i++; } des.push_back(word); } reverse(des.begin(), des.end()); if(des.empty()) s = ""; else { s.clear(); int j ; for(j = 0; j < des.size() -1; j++){ s += des[j]; s += ' '; } s += des[j]; } } };
另一種思路是使用特殊的存儲結構——棧,那麼此時我們就不需要再反轉了,直接順序保存即可,代碼如下:
class Solution { public: void reverseWords(string &s) { stackdes; if(s.empty()) return; int len = s.size(); for(int i = 0; i < len; i++){ if(s[i] == ' ') continue; string word; while(i < len && s[i] != ' '){ word += s[i]; i++; } des.push(word); } if(des.empty()) s = ""; else { s.clear(); int j ; int length = des.size(); for(j = 0; j < length -1; j++){ s += des.top(); des.pop(); s += ' '; } s += des.top(); } } };