Leetcode 557. 反转字符串中的单词 III

1.题目描述

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例 1:

输入: "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc" 

注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

 

2.一般解法

class Solution {
public:
    string reverseWords(string s) {
        if(s.size()==0) return s;
        
        //拷贝字符串
        for(auto a : s)
            res.push_back(a);//string也支持vector的push_back操作
        
        //遍历寻找空格
        int size = s.size();
        int begin = 0;
        for(int i=0; i<size; ++i){
            if(s[i]==' ')
            {
                reverse(res,begin,i-1);
                begin = i+1;
            }
        }
        //反转最后一个单词(for循环中未处理)
        reverse(res,begin,size-1);
        return res;        
    }
    
    //反转函数
    void reverse(string& s, int begin, int end){
        for(int m=begin; m<=(begin+end)/2; ++m)
            swap(s[m],s[begin+end-m]);
    }
    
private:
    string res;
};

 

3.优化代码

//推荐:迭代器放方式访问
class Solution {
public:
    string reverseWords(string s) {
        auto beg = s.begin(), end = s.begin();
        while(beg != s.end()) {
            while(beg != s.end() && *beg != ' ')
                ++beg;
            reverse(beg,end);//直接调用系统的reverse函数
            if(beg!=s.end()) end= ++beg;
        }
        return s;
    }
};

 

posted @ 2018-12-17 17:25  Timothy_prayer  阅读(134)  评论(0编辑  收藏  举报