LeetCode0151.反转字符串中的单词 Go语言AC笔记

时间复杂度:O(n),空间复杂度:O(1)

解题思路

主要思路就是先反转整个字符串,然后再反转每个单词。

但是在反转整个字符串之前需要处理冗余的空格,包括开头的空格、单词间超过1个的空格和末尾的空格。处理冗余空格需要用到快慢指针,快指针实现跳过冗余空格而慢指针实现更新操作,针对以上的三种空格按序做处理。

由于反转整个字符串和反转单词的逻辑一致,故可以单独写一个反转函数实现反转。

AC代码

func reverseWords(s string) string {
    slow,fast:=0,0 //处理冗余空格的快慢指针
    b:=[]byte(s) //将string类型转换为字节数组方便处理
    //处理开头的冗余空格
    for fast<len(s)&&b[fast]==' '{
        fast++
    }
    //处理单词间的冗余空格,可能会造成最后一个单词末尾有一个多余空格
    for ;fast<len(s);fast++{
        if fast>0&&b[fast-1]==' '&&b[fast]==' '{
            continue
        }
        b[slow]=b[fast]
        slow++
    }
    //处理最后一个单词后面的冗余空格
    if b[slow-1]==' '{
        b=b[:slow-1]
    }else{
        b=b[:slow]
    }

    //翻转字节数组形式字符串的函数
    reverse:=func(start,end int){
        for ;start<end;start,end=start+1,end-1{
            b[start],b[end]=b[end],b[start]
        }
    }
    //先翻转全部单词
    reverse(0,len(b)-1)

    //再逐个翻转每个单词
    for start:=0;start<len(b);{
        j:=start
        //判断是否为单词末尾
        for j<len(b)&&b[j]!=' '{
            j++
        }
        //翻转单词
        reverse(start,j-1)
        start=j+1
    }
    //将字节数组类型的字符串转换成string返回
    return string(b)
}

感悟

看了卡哥的题解受益匪浅,觉着比官方题解要好得多,实现了空间复杂度为O(1)的方法。

需要注意的是,由于在Go中string类型不可修改,故需要将string转换为字节数组,这样便可在原数组中做冗余空格的处理,最后返回时将字节数组转换为string即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SwithunH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值