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() - ;
int wHead = ;
int wTail = n ;
char cPunct = ' ';
if(s.size() == )
{
return;
}
if( n == )
{
if(s[] == ' ')
{
s.clear();
}
return;
} while( wHead < wTail )
{
char temp = s[wTail];
s[wTail] = s[wHead];
s[wHead] = temp;
wHead++;
wTail--;
} wTail = wHead = ;
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 - ) + " ";
wHead = wTail + ;
wordHead = true;
}
wTail++;
}
s = sRet;
if(s.size() > )
s.erase(s.size()-, ); }
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 + );
} };
应该认真的对待OJ上自己力所能及的每一题,多思考!