zoukankan      html  css  js  c++  java
  • Reverse Words in a String

    Question

    Given an input string, reverse the string word by word.
    
    For example,
    Given s = "the sky is blue",
    return "blue is sky the".
    
    Example
    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.

    题解

    1. 由第一个提问可知:题中只有空格字符和非空格字符之分,因此空格字符应为其一关键突破口。
    2. 由第二个提问可知:输入的前导空格或者尾随空格在反转后应去掉。
    3. 由第三个提问可知:两个单词间的多个空格字符应合并为一个或删除掉。

    首先找到各个单词(以空格隔开),根据题目要求,单词应从后往前依次放入。正向取出比较麻烦,因此可尝试采用逆向思维——先将输入字符串数组中的单词从后往前逆序取出,取出单词后即翻转并append至新字符串数组。在append之前加入空格即可。

    class Solution {
    public:
        /**
         * @param s : A string
         * @return : A string
         */
        string reverseWords(string s) {
            if (s.empty()) {
                return s;
            }
    
            string s_ret, s_temp;
            string::size_type ix = s.size();
            while (ix != 0) {
                s_temp.clear();
                while (!isspace(s[--ix])) {
                    s_temp.push_back(s[ix]);
                    if (ix == 0) {
                        break;
                    }
                }
                if (!s_temp.empty()) {
                    if (!s_ret.empty()) {
                        s_ret.push_back(' ');
                    }
                    std::reverse(s_temp.begin(), s_temp.end());
                    s_ret.append(s_temp);
                }
            }
    
            return s_ret;
        }
    };

    源码分析

    1. 首先处理异常,s为空时直接返回空。
    2. 索引初始值ix = s.size(),而不是ix = s.size() - 1,便于处理ix == 0时的特殊情况。
    3. 使用额外空间s_ret, s_temp,空间复杂度为O(n),s_temp用于缓存临时的单词以append入s_ret
    4. 最后返回s_ret

    空间复杂度为O(1)的解法?

    1. 处理异常及特殊情况
    2. 处理多个空格及首尾空格
    3. 记住单词的头尾指针,翻转之
    4. 整体翻转

     使用 sstream 进行处理,另外也可以用 strtok 进行处理,下面提供 sstream 的处理方案

    Code:

    #include <iostream>
    #include <string>
    #include <cstdio>
    #include <sstream>
    #include <vector>
    
    using namespace std;
    
    int main(){
        
        string str = "The sky  is blue";
        cout<<"Origin string : "<<str<<endl;
        vector<string> v;
        stringstream input(str);
        string temp;
        while(input>>temp){
            v.push_back(temp);
        }
        
        for (int i=v.size()-1;i>0;i--) {
            cout<<v[i]<<" ";
        }
        cout<<v[0]<<endl;
        return 0;
    }

    OutPut:

    Origin string : The sky  is blue
    blue is sky The
  • 相关阅读:
    MFC CDialog/CDialogEx DoModal ALT
    yum和apt-get用法及区别
    ubuntu 12.04 source.list 源更新
    elasticsearch 优化
    TRIE树
    数据统计经验浅谈
    机器学习
    python 读取libsvm文件
    spark 参数调优
    python中的一些函数
  • 原文地址:https://www.cnblogs.com/lyc94620/p/10026046.html
Copyright © 2011-2022 走看看