老师使用的查找重复的字符是使用一个计数数组,我改成了直接遍历前面的字符是否与最右边的那个字符是否相同,相同的话,返回重复字符的索引,l直接前进到索引的下一个字符。这样查找重复元素的累计时间是n,所以最后的时间复杂度还是o(n)的。
func lengthOfLongestSubstring(s string) int {
str := []rune(s)
l, r := 0, 0 // str[l, ... r-1] 滑动窗口
res := 0
for r < len(str) {
isDup, index := isDuplicateChar(str, l, r)
if !isDup {
if r-l+1 > res {
res = r - l + 1
}
r++
} else {
l = index + 1
}
}
return res
}
// 新加入的str[r]是否和[l, r-1]之间的字符重复,如果重复,则返回重复字符的位置
func isDuplicateChar(str []rune, l, r int) (bool, int) {
for i := l; i < r; i++ {
if str[i] == str[r] {
return true, i
}
}
return false, -1
}