3. 无重复字符的最长子串
给定一个字符串 s,请你找出其中不含有重复字符的 最长 子串的长度。
md
示例 1:
输入:s = "abcabcbb"
输出:3
解释:因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入:s = "bbbbb"
输出:1
解释:因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入:s = "pwwkew"
输出:3
解释:因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。思路
使用滑动窗口,记录窗口内出现的字符,如果出现重复字符,则将窗口左边界向右移动,直到没有重复字符;
TIP
某大厂面试的算法题就是此题,题目要求是找出最长不重复子串,而非长度;
go
func lengthOfLongestSubstring(s string) int {
cnt := make(map[rune]int)
res := ""
maxLen := 0
j :=0
for i,c := range s {
if _,ok:=cnt[c];ok{
cnt[c]++
}else{
cnt[c] = 1
}
// 收缩
for cnt[c] >=2 {
cnt[rune(s[j])]--
j++
}
curLen := i - j + 1
if curLen > maxLen{
maxLen = curLen
res = s[j:i+1]
}
}
return len(res)
}