题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
该题是leetcode 的第三题。
思路
滑动窗口:
- 开始左右两边一样,从左到右遍历,也就是窗口右端右移;
- 判断是否含有重复字符,不含有,修改最大值,继续右移;
- 含有的话,窗口左端右移,注意,这里左端右移可能为1,2,... right位;
代码实现
func lengthOfLongestSubstring(s string) int {
if len(s) == 1 {
return 1
}
left := 0
right := 0
var res int
// mchar map用于计数,因为是字符串,所以key为byte类型
// 含有重复的字符,那么mchar[key]>1
mchar := make(map[byte]int)
for ; right < len(s); right++ {
mchar[s[right]]++
// mchar[s[right]] > 1 ;含有重复字符,需要调整窗口左端右移
for mchar[s[right]] > 1 {
mchar[s[left]]--
left++
}
// 修改最大值
if res < right - left +1 {
res = right - left + 1
}
}
return res
}