【Leetcode字符串】151.翻转字符串里的单词 BM83.字符串变形(有对于字符串分割的总结!!关于字符串操作的很重要操作分析!!)



本题可参考以下博客:

char*和string的相互转化
strtok()函数的用法
STL-string 使用find() substr()等函数实现复杂分割字符串的功能对标java的split API



Leetcode151

1.问题描述

在这里插入图片描述
在这里插入图片描述

2.解决方案


重要步骤:去重冗余空格操作

1.使用string库函数erase()直接移除

逻辑很简单就遇见多余空格就移除,但是移除函数最快,自己实现用双指针也得o(n)27. 移除元素,那么整体代码就是o(n^2)了很慢

void removeExtraSpaces_low(string& s) {
   
    //1.删除中间的空格
    for(int i=s.size()-1;i>0;i--) {
   
        if (s[i]==s[i - 1]&&s[i]==' ') {
   
            s.erase(s.begin() + i);
        }
    }
    //2.删除字符串最后面的空格
    if (s.size() > 0 && s[s.size() - 1] == ' ') {
   
        s.erase(s.begin() + s.size() - 1);
    }
    //3.删除字符串最前面的空格
    if (s.size() > 0 && s[0] == ' ') {
   
        s.erase(s.begin());
    }
}
2.使用双指针

1.使用双指针法来去移除空格,最后resize(重新设置)一下字符串的大小,就可以做到O(n)的时间复杂度。
2.fastIndex走的快,slowIndex走的慢,最后slowIndex就标记着移除多余空格后新字符串的长度。
3.其实就是一个字符串有很多没用的字符,fastIndex在前面进行筛选正确的字符就赋给slowIndex,错误的fastIndex就直接略过,所以最后slowIndex走过的就是真正的目标字符串!

//移除冗余空格:使用双指针(快慢指针法) O(n)的算法
//去掉冗余空格 " This is  a  sentence with 7 tokens  " --变为-->"This is a sentence with 7 tokens"
void removeExtraSpaces(string& s) {
   
    //1.定义快指针,慢指针
    int slowIndex=0, fastIndex=0;
    //2.去掉字符串前面的空格
    while (s.size() > 0 && fastIndex<s.size()&&s[fastIndex]==' '){
   
        fastIndex++;
    }
    //3.去掉字符串中间部分的冗余空格
    for (;fastIndex<s.size();fastIndex++) {
   
        //最妙的地方!!!!!!!
        //遇到中间多余的空格(从第二个空格开始算多余的),直接略过,如果是第一个空格或者字母直接赋值给慢指针
        if (fastIndex-1>0 && s[fastIndex-1]==s[fastIndex] && s[fastIndex]==' '){
   
            continue;
        }else{
   
            s[slowIndex++]=s[fastIndex];
        }
    }
    //4.去掉字符串末尾的空格,因为如果字符串原本最后有很多空格,第一个空格是会被记录到slowIndex中的,所以要清楚一下
    if(slowIndex-1> 0 && s[slowIndex-1]==' ') {
   
        s.resize(slowIndex - 1);
    } else {
   
        s.resize(slowIndex); // 重新设置字符串大小
    }
}



解法一:不使用辅助空间

提升难度:不要使用辅助空间,空间复杂度要求为O(1)。

在这里插入图片描述

class Solution1 {
   
public:
    //反转字符串s中左闭又闭的区间[start, end]
    void reverse(string& s, int start, int end) {
   
        for (int i = start, j = end; i < j; i++, j--) {
   
            swap(s[i], s[j]);
        }
    }

    void removeExtraSpaces_low(string& s) {
   
 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值