Given an input string, reverse the string word by word.
For example, Given s = "the sky is blue
", return "blue is sky the
".
Update (2015-02-12): For C programmers: Try to solve it in-place in O(1) space.
这题遇到的困难主要是细节地方处理的不好:(1)空格的处理,(2)标点符号reverse?
主要思路:(1)万事开头难,你必须首先就把一些空串,单个字符串等一些在后面会出现bug的输入处理掉!!!
(2)把第一步处理好之后,将整个字符串翻转过来,标点当成字符处理。
(3)每个单词翻转,并用一个string存储。然后补充一个空格,直到处理完整个串。
(4)判断字符串是否为空(如果前面输入多个空格,到这里得到一个空字符串),非空则删除最后一个空格。
(5)输出结果。
在单词翻转的时候,使用布尔型wordHead记录是否是单词头而不是空格,确保只针对单词翻转。
class Solution { public: void reverseWords(string &s) { int n = s.size() - 1; int wHead = 0; int wTail = n ; char cPunct = ' '; if(s.size() == 0) { return; } if( n == 0 ) { if(s[0] == ' ') { s.clear(); } return; } while( wHead < wTail ) { char temp = s[wTail]; s[wTail] = s[wHead]; s[wHead] = temp; wHead++; wTail--; } wTail = wHead = 0; string sRet; bool wordHead = true; while(wTail <= n) { if(!isspace(s[wTail]) && wordHead) { wHead = wTail; wordHead = false; } if( ( s[wTail] == ' ' || wTail == n) && !isspace(s[wHead])) { if(wTail == n && !isspace(s[wTail])) wTail++; sRet += SwapWord(s, wHead, wTail - 1) + " "; wHead = wTail + 1; wordHead = true; } wTail++; } s = sRet; if(s.size() > 0) s.erase(s.size()-1, 1); } string SwapWord(string &s, int wHead, int wTail) { int wStart = wHead; int wEnd = wTail; while( wStart < wEnd ) { char temp = s[wStart]; s[wStart] = s[wEnd]; s[wEnd] = temp; wStart++; wEnd--; } return s.substr(wHead, wTail - wHead + 1); } };
应该认真的对待OJ上自己力所能及的每一题,多思考!