当前位置: 首页 > news >正文

leetcode151 反转字符串中的单词

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

  1. 去除多余空格。

  2. 反转整个字符串。

  3. 反转每个单词。

1.

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.快慢指针法

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.有、乱除非背下来估计想不好

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;
        }  
};

代码随想录

相关文章:

  • Spring Boot 中 @Transactional 注解全面解析
  • MySQL中json类型数据查询
  • 线性回归(一)基于Scikit-Learn的简单线性回归
  • DeepSeek + Higress AI 网关/Spring AI Alibaba 案例征集
  • 博云先进算力管理平台AIOS已上线全尺寸DeepSeek系列模型
  • 15.代码随想录算法训练营第十五天|(递归)110. 平衡二叉树,257. 二叉树的所有路径*,404. 左叶子之和,222.完全二叉树的节点个数[打卡自用]
  • JavaWeb-ServletContext应用域接口
  • Codeforces Round 1006 (Div. 3)(部分题解)
  • 图神经网络:拓扑数据分析的新时代
  • 单点登录原理和JWT实现
  • 算法-图-查找路径
  • mybatisPlus打印sql配置
  • 在nodejs中使用ElasticSearch(三)通过ES语义检索,实现RAG
  • springboot集成deepseek4j
  • 「Selenium+Python自动化从0到1①|2025最新环境搭建+浏览器驱动避坑指南(附验证代码)」
  • k8s中pod的调度策略之pod的亲和性调度与反亲和性调度 一文搞懂 k8s中创建的pod如何调度?
  • Spring Cloud Alibaba学习 3- Sentinel入门使用
  • java后端开发day20--面向对象进阶(一)--static继承
  • C# Unity 唐老狮 No.1 模拟面试题
  • 在Linux环境下利用MTCNN进行人脸检测(基于ncnn架构)
  • 对谈|李钧鹏、周忆粟:安德鲁·阿伯特过程社会学的魅力
  • 第二十届中国电影华表奖揭晓!完整获奖名单来了
  • 加拿大温哥华发生驾车冲撞人群事件,加拿大总理发声
  • 葛兰西的三位一体:重提并复兴欧洲共产主义的平民圣人
  • 《深度参与全球海洋治理的重大科技问题战略研究》一书出版发行
  • QFII一季度现身超300家公司:持有南京银行市值最高,5家青睐立航科技