字符串 - 反转字符串II
这里我们以力扣541题为例,讲讲如何在Go中反转字符串II.
这道题和之前的反转字符串类似,只不过加上了些条件而已。
以2k长度为窗口
- 在窗口内的字符串,前
k个字符串进行反转 - 当窗口内的字符串不够
2k,全部反转
上述就是反转规则了。
接下来我们需要将交换逻辑抽象出一个函数。在抽象的时候,需要注意是左闭右开还是左闭右闭。这个很重要。
我们以上图为例,k = 2。首先,我们是需要交换ab的位置,此时i=0,这是a的下标,b的下标是i+1,但是呢,我们不能这样写b的下标,最终下标一定要和k绑上关系,所以b的下标是i+k-1,想想是不是这样的。
关于b的-1操作,我们统一放在交换函数里做。
那窗口内的字符串不够2k,我们需要对余下的字符串全部反转,结束位置那就是字符串的长度了。
func reverseStr(s string, k int) string {
strByte := []byte(s)
for i := 0; i < len(strByte); i+=2*k{
if i+k-1 < len(strByte) {
reverse(strByte, i, i+k)
continue
}
reverse(strByte, i, len(strByte))
}
return string(strByte)
}
func reverse(s []byte, i, j int) {
l := i+j
for ; i < l/2; i, j = i+1, j-1{
s[i], s[j-1] = s[j-1], s[i]
}
}