双索引滑动窗口:时间复杂度为O(n)
// 双索引滑动窗口
func lengthOfLongestSubstring2(in string) int {
n := len(in)
if n < 2 {
return n
}
maxLength := 1
startI, endI := 0, 0 //[startI...endI]为无重复字符子串
m := make(map[rune]int)
// 两种情况:1种m[ch]在startI之后,可以加上长度+1,
// 1种在startI之前,startI要变成m[ch]+1
for i, ch := range in {
// 存储的值索引+1,是为了统一逻辑好写代码,
// 不然首位元素索引为0,跟map的默认值0相同,得单独区分写代码
endI = i + 1
if m[ch] >= startI {
startI = m[ch] + 1
} else {
// 新出现的字符在startI左边,则无重复子串长度+1,找出其中最长子串长度
maxLength = max(maxLength, endI-startI+1)
}
m[ch] = endI
}
return maxLength
}
func max(x int, y int) int {
if x >= y {
return x
}
return y
}
提交leetcode,通过