字符串 - 反转字符串II

65 阅读1分钟

字符串 - 反转字符串II

这里我们以力扣541题为例,讲讲如何在Go中反转字符串II.

image.png

这道题和之前的反转字符串类似,只不过加上了些条件而已。

2k长度为窗口

  1. 在窗口内的字符串,前k个字符串进行反转
  2. 当窗口内的字符串不够2k,全部反转

image.png 上述就是反转规则了。

接下来我们需要将交换逻辑抽象出一个函数。在抽象的时候,需要注意是左闭右开还是左闭右闭。这个很重要。 我们以上图为例,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]
    }
}