leetcode 151. 翻转字符串里的单词

问题描述

给定一个字符串,逐个翻转字符串中的每个单词。

 

示例 1:

输入: "the sky is blue"
输出: "blue is sky the"
示例 2:

输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:

输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
 

说明:

无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
 

进阶:

请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。

代码

class Solution {
public:
    string reverseWords(string s) {
        if(s.size()==0)return s;
        string ans;
        int n = s.size(),start = 0,end = n-1;
        //去除头尾的空格
        while(s[start]==' ')
        {
            ++start;
        }
        if(start == end+1)return "";
        while(s[end]==' ')
        {
            --end;
        }
        //
        int i = start,len = 0;
        while(i <= end)
        {
            if(s[i] == ' ')
            {
                if(len)ans = s.substr(start,len)+" "+ans;//防止出现中间过多的空格
                start = i+1;
                len = 0;
            }
            else{
                ++len;
            }
            ++i;
        }
        ans = s.substr(start,len)+" "+ans;
        //return ans;
        return ans.substr(0,ans.size()-1);
    }
};

结果:

执行用时:28 ms, 在所有 C++ 提交中击败了13.06%的用户
内存消耗:64.6 MB, 在所有 C++ 提交中击败了30.77%的用户
posted @ 2020-07-07 15:51  曲径通霄  阅读(131)  评论(0编辑  收藏  举报