时间复杂度: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即可。