题解:
直观上能想到肯定有复杂度为O(N)的算法,肯定是要遍历一次字符串,肯定要记录当前字符的位置,每遍历一个字符统计一下当前达到的最大子串长度,需要记录左边界的位置,并实时更新。由于索引0和map的默认值一样,所以m[c]=i+1,这是为了保持0的唯一哨兵语义。
代码:
func lengthOfLongestSubstring(s string) int {
result := 0
var m [256]int
left := 0
for i, c := range s {
left = max(left, m[c])
result = max(result, i - left + 1)
m[c] = i + 1
}
return result
}
func max(x, y int) int {
if x > y {
return x
}
return y
}