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

反转字符串中的单词

题目

在这里插入图片描述

思路

题目的难点在于首先要清除多余的空格,并且单词之间要留一个空格,首单词前和末尾单词后不能有多余空格。我们使用双指针去除所有的空格,然后在处理完一个单词后手动加一个单词。具体思路是当快指针不等于空格时,赋值给慢指针,然后快慢指针同时移动,当快指针等于空格时,慢指针不动,快指针循环移动,一直循环到不等于空格时,继续上述操作。每当处理完一个单词,此时慢指针手动加一个空格,已满足每个单词之间要有一个空格的要求。判断slow != 0,是因为开头有可能有多余的空格,此时不需要额外添加。

其次需要翻转,我们首先将s所有的字符整体翻转过来,然后逐个翻转单词。注意s的范围在0-s.size-1,而s.size()为\0。最后的for循环到s.size()是为了知道到末尾了,方便翻转最后一个单词。

代码

class Solution {
    
    
public:
    //翻转函数
    void reverse (string& s, int x, int y) {
    
    
        for (int i = x, j = y; i < j; i++, j--) {
    
    
            swap(s[i], s[j]);
        }
    }
    //删除多余的空格
    void deleteExtraSpaces (string& s) {
    
    
        //双指针法删除多余空格
        int slow = 0;
        for (int fast = 0; fast < s.size(); fast++) {
    
    
            if (s[fast] != ' ') {
    
    
                //删除所有空格,然后在相邻单词之间手动加一个空格。
                if (slow != 0) s[slow++] = ' ';
                while (fast < s.size() && s[fast] != ' ') {
    
    
                    s[slow++] = s[fast++];
                }
            }
        }
        s.resize(slow);
    }
    //翻转,先清除多余空格,翻转所有字符串,在单个翻转单词
    string reverseWords(string s) {
    
    
        deleteExtraSpaces(s);
        reverse(s, 0, s.size() - 1);
        int start = 0;
        for (int i = 0; i <= s.size(); i++) {
    
    
            //对每个单词翻转,到达空格或者串尾,说明一个单词结束。
            if (s[i] == ' ' || i == s.size()) {
    
    
                reverse(s, start, i - 1);
                //下一个单词开始为i+1
                start = i + 1;
            }
        }
        return s;
    }
};

猜你喜欢

转载自blog.csdn.net/GamBleout/article/details/142398820