Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
二、思路分析
- 新建一个map用于记录字符是否出现过,使用滑动窗口方法遍历,rk代表右指针。
- i代表左指针,i每向右移动一格,则删除窗口内一个字符,如果m中没有s[rk+1]的字符,则更新map中rk+1的部分,并且将rk右移。
- 最后比较ans 与当前窗口长度,如果ans比当前窗口长度小,则更新当前ans为当前窗口长度。
三、AC 代码
func lengthOfLongestSubstring(s string) int {
rk := -1
ans := 0
m := make(map[byte]int,0)
for i := 0 ;i < len(s);i++ {
if i != 0 {
delete(m,s[i-1])
}
for rk + 1 < len(s) && m[s[rk+1]] == 0 {
m[s[rk+1]]++
rk++
}
if ans < rk - i +1 {
ans = rk-i+1
}
}
return ans
}
四、总结
滑动窗口是一种常用方法,无重复最长字串,没有遇到重复的情况下一直移动右指针,判断重复则使用map记录字符,每一轮移动左指针会删除一个元素,都会有ans记录最大值为多少,遍历完成后返回ans即可。