zoukankan      html  css  js  c++  java
  • 【LeetCode练习题】Reverse Words in a String

    Reverse Words 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".

    Clarification:
    • What constitutes a word?
      A sequence of non-space characters constitutes a word.
    • Could the input string contain leading or trailing spaces?
      Yes. However, your reversed string should not contain leading or trailing spaces.
    • How about multiple spaces between two words?
      Reduce them to a single space in the reversed string.

    反转string里面的单词顺序。

    注意在Clarification里头:

    一个单词中不包含空格,字符串开始和结尾可以有若干个空格符号,单词与单词之间的空格可以有一个或多个空格符号,我们需要把他变成一个空格。

    解题思路:

    我是这样想的,把s中的每一个单词都分割出来存储到一个vector里面去,再让这个vector从后往前遍历,result字符串就是题目中要求的格式了,然后赋值给s就行了。

    首先,如何去掉字符串s首尾的空格呢?

    通过string的find_first_not_of()和find_last_not_of()方法,分别用begin和end指向第一个单词的开始和最后一个单词的结尾处,接下来,只需要在begin和end范围里进行for循环就行了。

    那~怎么判断我当前的 i 是在单词里面还是在单词外面呢?

    设置一个bool 变量 betweenWord,当betweenWord为true表示在单词内部,betweenWord为false时在单词外面。

    当从单词内部到下一个空格字符时,通过substr获得第一个单词,然后设置betweenWord为false,当下一个字符不是空格时候,说明进入了单词内部了,用cur指向该单词的第一个位置,然后继续遍历直到下一个空格处,说明不在单词内部了,我们获得另一个sub单词,存进vector。

    最后,用result字符串保存符合格式的字符串,再赋值给s。

    代码如下:

    class Solution {
    public:
        void reverseWords(string &s) {
            size_t begin = s.find_first_not_of(" ");
            if(begin == string::npos){
                //s中全都是空格符号
                s = "";
                return ;
            }
            size_t end = s.find_last_not_of(" ");
            bool betweenWord = true;
            string sub,result;
            size_t cur = begin;
            vector<string> vec;
    
            for(int i = begin; i <= end; i++){
                if(betweenWord){
                    if(s[i] == ' ' || i == end){
                        //进入到单词外部
                        if(i == end){
                            sub = s.substr(cur,i-cur+1);
                            vec.push_back(sub);
                        }
                        else{
                            sub = s.substr(cur,i-cur);
                            vec.push_back(sub);
                        }
                        betweenWord = false;
                    }
                }
                else{
                    if(s[i] != ' '){
                        //进入单词内部
                        if(i == end){
                            //最后一个单词只有一个字符的情况
                            sub = s.substr(i,1);
                            vec.push_back(sub);
                        }
                        cur = i;
                        betweenWord = true;
                    }
                }                    
            }
            
            for(int i = vec.size()-1; i > 0; i--){
                result += vec[i] + " ";
            }
            result += vec[0];
            
            s = result;
        }
    };

    哎,我写了那么多,别人用十几行就搞定了,这就是差距啊……

    Orz……

        void reverseWords(string &s)
        {
            string rs;
            for (int i = s.length()-1; i >= 0; )
            {
                while (i >= 0 && s[i] == ' ') i--;
                if (i < 0) break;
                if (!rs.empty()) rs.push_back(' ');
                string t;
                while (i >= 0 && s[i] != ' ') t.push_back(s[i--]);
                reverse(t.begin(), t.end());
                rs.append(t);
            }
            s = rs;
        }
    View Code
  • 相关阅读:
    2016.7.22.noip2012D2
    2016.7.21.noip2014D2
    LIS最长上升子序列O(n^2)与O(nlogn)的算法
    vijos1910解方程
    vijos1909寻找道路
    viojs1908无线网路发射器选址
    P1907飞扬的小鸟
    P1906联合权值
    P1905生活大爆炸版 石头剪刀布
    poj1274(匈牙利算法)
  • 原文地址:https://www.cnblogs.com/4everlove/p/3661337.html
Copyright © 2011-2022 走看看