leetcode151 反转字符串中的单词

其实就是整体反转,再局部反转,反反得正,最后就解出来了。

  1. 去除多余空格。

  2. 反转整个字符串。

  3. 反转每个单词。

cpp 复制代码
class Solution {
public:
    void reverse(string& s, int begin, int end){
        for(int i = begin,j=end; i < j; i++, j--){
            swap(s[i], s[j]);
        }
    }

    string reverseWords(string s) {
        int n = s.size();
        while(s[0] == ' '){
            s.erase(s.begin());
            n--;
        }
        while(s[n-1] == ' '){
            s.erase(n-1);
            n--;
        }
        for(int i = 0; i < n-1; i++){
            while(s[i] == ' ' && s[i+1] == s[i]){
                s.erase(i, 1);
                n--;
            }
        }

        reverse(s, 0, n-1);
        int start = 0;
        for(int i = 0; i <= n; i++){
            if(i == n || s[i] == ' '){
                reverse(s, start, i-1);
                start = i + 1;
            }
        }
        return s;
        }  
};

想一下真正的时间复杂度是多少,一个erase本来就是O(n)的操作。

erase操作上面还套了一个for循环,那么以上代码移除冗余空格的代码时间复杂度为O(n^2)。

2.快慢指针法

cpp 复制代码
class Solution {
public:
    void reverse(string& s, int begin, int end){
        for(int i = begin,j=end; i < j; i++, j--){
            swap(s[i], s[j]);
        }
    }


    string reverseWords(string s) {
        int n = s.size();
        int slow = 0, fast = 0;
        while(s[fast] == ' ') fast++;
        for(; fast < n; fast++){
            if(fast-1 > 0 && s[fast] == ' ' && s[fast-1] == s[fast]){
                continue;
            }
            s[slow++] = s[fast];
        }

        if(slow - 1 > 0 && s[slow-1] == ' '){
            s.resize(slow-1);
        }else{
            s.resize(slow);
        }

        n = s.size();

        reverse(s, 0, n-1);

        int start = 0;
        for(int i = 0; i <= n; i++){
            if(i == n || s[i] == ' '){
                reverse(s, start, i-1);
                start = i + 1;
            }
        }

        return s;
        }  
};

string.resize(2);尺寸变小,改变为2,多余字符被截掉了

str3.resize(10,'b');尺寸变大,可以给一个填充参数。尺寸由6变大到10,4个空位填充b(默认参数为0,即NULL或者'\0')。

删除多余空格后不要忘记重新计算n!!!

3.有、乱除非背下来估计想不好

cpp 复制代码
class Solution {
public:
    void reverse(string& s, int begin, int end){
        for(int i = begin,j=end; i < j; i++, j--){
            swap(s[i], s[j]);
        }
    }

    void removeExtraSpaces(string& s){
        int slow = 0, fast = 0;
        int n = s.size();
        for(; fast < n; fast++){
            if(s[fast] != ' '){
                if(slow != 0) s[slow++] = ' ';
                while(fast < n && s[fast] != ' '){
                    s[slow++] = s[fast++];
                }
            }
        }
        s.resize(slow);
    }

    string reverseWords(string s) {
        
        
        removeExtraSpaces(s);
        int n = s.size();
        reverse(s, 0, n-1);

        int start = 0;
        for(int i = 0; i <= n; i++){
            if(i == n || s[i] == ' '){
                reverse(s, start, i-1);
                start = i + 1;
            }
        }

        return s;
        }  
};

代码随想录

相关推荐
程序员-King.1 小时前
day158—回溯—全排列(LeetCode-46)
算法·leetcode·深度优先·回溯·递归
月挽清风2 小时前
代码随想录第七天:
数据结构·c++·算法
小O的算法实验室2 小时前
2026年AEI SCI1区TOP,基于改进 IRRT*-D* 算法的森林火灾救援场景下直升机轨迹规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
小郭团队3 小时前
2_1_七段式SVPWM (经典算法)算法理论与 MATLAB 实现详解
嵌入式硬件·算法·硬件架构·arm·dsp开发
充值修改昵称3 小时前
数据结构基础:从二叉树到多叉树数据结构进阶
数据结构·python·算法
Deepoch3 小时前
Deepoc数学大模型:发动机行业的算法引擎
人工智能·算法·机器人·发动机·deepoc·发动机行业
浅念-4 小时前
C语言小知识——指针(3)
c语言·开发语言·c++·经验分享·笔记·学习·算法
Hcoco_me4 小时前
大模型面试题84:是否了解 OpenAI 提出的Clip,它和SigLip有什么区别?为什么SigLip效果更好?
人工智能·算法·机器学习·chatgpt·机器人
BHXDML5 小时前
第九章:EM 算法
人工智能·算法·机器学习
却道天凉_好个秋5 小时前
目标检测算法与原理(三):PyTorch实现迁移学习
pytorch·算法·目标检测