zoukankan      html  css  js  c++  java
  • 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上自己力所能及的每一题,多思考!

  • 相关阅读:
    hdu 1290 献给杭电五十周年校庆的礼物 (DP)
    hdu 3123 GCC (数学)
    hdu 1207 汉诺塔II (DP)
    hdu 1267 下沙的沙子有几粒? (DP)
    hdu 1249 三角形 (DP)
    hdu 2132 An easy problem (递推)
    hdu 2139 Calculate the formula (递推)
    hdu 1284 钱币兑换问题 (DP)
    hdu 4151 The Special Number (DP)
    hdu 1143 Tri Tiling (DP)
  • 原文地址:https://www.cnblogs.com/bestwangjie/p/4433957.html
Copyright © 2011-2022 走看看