力扣:151. 反转字符串中的单词

思路

首先整体翻转一遍,然后利用双指针找单词,把单词往前移,一直覆盖,就像27. 移除元素 一样。

解题方法

先整体翻转。
遍历数组,判断当前元素是不是空格,如不是(if (idx != 0) 等会说):
那就是当前元素是单词了,往前覆盖,一直到当前元素是空格,此时idx指向单词的下一个位置,因为while里最后一次给++了,此时翻转这个单词,由于翻转是左闭右开,所以reverse(s.begin() + idx - count, s.begin() + idx);正好可以翻转整个单词(count计数器计算这个单词长度)。

接下来说一下if (idx != 0) :
当前元素不是空格时,idx此时还指着上一个单词的下一个位置,又因为让单词和单词之间有一个空格,所以咱s[idx++] = ' ';又第一个位置不能有空格,所以咱判断 if (idx != 0) ,当idx离开初始位置的时候idx肯定不等于0了。

复杂度

时间复杂度:

计算:O(n+m),其中m为单词长度和,且m<n。
所以 O(n+m)应该<O(n+n)=O(n)

空间复杂度:

O(1)

 

class Solution {
public:
    string reverseWords(string s) {
        reverse(s.begin(), s.end());
        int idx = 0;
        int count = 0;
        for (int i = 0; i < s.size(); ++i) {
             count = 0;
            if (s[i] != ' ') 
            {
                if (idx != 0) 
                {
                    s[idx] = ' ';
                    idx++;
                }
                while (i < s.size() && s[i] != ' ') 
                {
                    s[idx] = s[i];
                    idx++, i++;
                    count++;
                }
                reverse(s.begin() + idx - count, s.begin() + idx);
            }
        }
        s.erase(s.begin() + idx, s.end());
        return s;
    }
};

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值