解决思路为:
左右指针实现滑动窗口
窗口里为包含n个不同字符的子串
遍历一次,记录最短的子串
package main
import (
"fmt"
"math"
)
func main() {
str := "abbbccdd"
n := 3
ans := ""
l, r := 1, 1
dif := 1 //l到r中间 出现的不同字符的个数
minlen := math.MaxInt32
rlastchar := str[0] //记录上一个字符 判断当前的是不是换了不同的字符
llastchar := str[0] //l也需要记录上一个字符
for r < len(str) {
if dif < n {
//如果当前l到r的子串 不同字符不够n个就继续r++
if str[r] != rlastchar {
//如果出现了不同字符 就把不同字符个数加1
dif++
rlastchar = str[r]
}
r++
} else {
//不同字符够n个了 就记录一下当前的子串长度
if r-l+1 < minlen {
minlen = r - l + 1
ans = str[l-1 : r]
}
//如果l指向的字符和之前的不一样了,代表遇见了不同的,也就是前面的一个字符可以减去了
if str[l] != llastchar {
dif--
llastchar = str[l]
}
l++
}
}
fmt.Println(ans)
}