0
点赞
收藏
分享

微信扫一扫

151. 翻转字符串里的单词(字符串 双指针法)(Leetcode刷题笔记)

夏沐沐 2022-02-06 阅读 71

151. 翻转字符串里的单词(字符串 双指针法)(Leetcode刷题笔记)

https://lunan0320.cn

文章目录

题目

给你一个字符串 s ,逐个翻转字符串中的所有 单词 。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。

说明:

输入字符串 s 可以在前面、后面或者单词间包含多余的空格。
翻转后单词间应当仅用一个空格分隔。
翻转后的字符串中不应包含额外的空格。

解题代码 C++ (双指针法)

class Solution {
public:
    //在闭区间上将字符串逆序
    void reverse_substr(string& s, int begin, int end){
        while(end > begin){
            swap(s[begin],s[end]);
            begin++;
            end--;
        }
    }
    //去除多余空格
    void removeSpace(string& s){
        int slow = 0;
        int fast = 0;
        //去除前面的空格
        while(fast < s.size() && s[fast] == ' '){
            fast++;
        }
        //去除中间的空格
        while (fast < s.size()){
            if(fast > 1 && s[fast-1] == ' ' && s[fast] == s[fast-1]){
                fast++;
                continue;
            }
            s[slow++] = s[fast++];
        }
        //去除末尾的空格
        if(s[slow-1]==' ') {
            s.resize(slow-1);
        }else s.resize(slow);

    }
    string reverseWords(string s) {
        //先去除多余的空格
        removeSpace(s);
        //将整个字符串逆序
        reverse_substr(s,0,s.size()-1);
        int begin = 0;
        int end = 0;
        bool word = false;
        //每个单词翻转一次
        for(int i = 0; i < s.size(); i++){
            //布尔遍历word决定当前字母是否在单词内,确定起始点
            if(!word){
                begin = i;
                word = true;
            }
            //中间以空格分隔每个单词,依次翻转
            if(s[i]==' '){
                reverse_substr(s, begin, i-1);
                word = false;
            }
            //末尾最后一个单词,翻转
            if(i == s.size()-1){
                reverse_substr(s, begin, i);
            }
        }
        return s;
    }
};

算法效率

举报

相关推荐

0 条评论