zoukankan      html  css  js  c++  java
  • LeetCode(151) 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”.

    Update (2015-02-12):
    For C programmers: Try to solve it in-place in O(1) space.

    click to show clarification.

    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.

    分析

    给定一个字符串,以单词为单位对该字符串进行翻转,要求空间复杂度为O(1);

    额外要求:

    1. 单词之间最多只能有一个空格,多余空格要删除;
    2. 字符串首尾不能添加多余空格;

    方法一:此题的一个简单的解法,就是,我们可以借助vector,把字符串的单词按序加入容器,然后直接反转容器,再更新元字符串即可,但是此方法不符合空间复杂度的要求。

    方法二:经过两步解决,首先,反转整个字符串,然后从前向后遍历,每经过一个单词,反转该单词一次。
    当然在过程中,必须合理的处理多余空格问题。详见代码!

    AC代码

    
    class Solution {
    public:
        void reverseWords(string &s) {
            if (s.empty())
                return;
    
            //首先,反转整个字符串
            reverse(s.begin(), s.end());
    
            int n = s.size();
    
            //再反转每个单词,同时删除多余的空格,最终的字符串头尾不能是空格,且单词之间不能有多余的空格(最多一个)
            string tmp = s;
            s.clear();
            //标记第一个单词,方便处理单词间的空格
            bool flag = true;
            for (int i = 0; i < n;)
            {       
                //找到第一个非空格
                if (tmp[i] == ' ')
                {
                    ++i;
                    continue;
                }//if
    
                string::iterator beg = tmp.begin() + i, end = tmp.begin();
    
                for (int j = i; j < n; ++j)
                {               
                    //到达一个单词间的空格或者到整个字符串的结束
                    if (tmp[j] == ' ')
                    {
                        end += j;
    
                        reverse(beg, end);
                        //链接反转后的第一个单词
                        if (flag)
                        {
                            s = s + tmp.substr(i, j - i);
                            flag = false;
                        }
                        else{
                            s = s + " " + tmp.substr(i, j - i);
                        }
    
                        i = j + 1;
                        break;
                    }//if
    
                    if (j == n - 1)
                    {
                        reverse(beg, tmp.end());
                        if (flag)
                        {
                            s = s + tmp.substr(i, j - i + 1);
                        }
                        else{
                            s = s + " " + tmp.substr(i, j - i + 1);
                        }
                        i = j + 1;
                        break;
                    }
                }//for
            }//for
        }
    };
    

    GitHub测试程序源码

  • 相关阅读:
    BZOJ 2743: [HEOI2012]采花( 离线 + BIT )
    BZOJ 1031: [JSOI2007]字符加密Cipher( 后缀数组 )
    BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式( 二分答案 + 后缀数组 )
    HDU 2602 Find a way BFS搜索
    HDU 1495 非常可乐 BFS搜索
    UVA 11624 Fire! BFS搜索
    FZU2150 Fire Game BFS搜索
    POJ3414 Pots BFS搜素
    POJ3087 Shuffle'm Up 简单模拟
    POJ 3126 Prime Path BFS搜索
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214778.html
Copyright © 2011-2022 走看看