LeetCode 151 reverse word in a string

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上自己力所能及的每一题,多思考!

原文地址:https://www.cnblogs.com/bestwangjie/p/4433957.html