题目描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,”pwke” 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的答案
1 | func lengthOfLongestSubstring(s string) int { |
解题思路
Ⅰ
利用s[left:i+1]
来表示s[:i+1]
中的包含s[i]
的最长子字符串。 location[s[i]]
是字符s[i]
在s[:i+1]
中倒数第二次出现的序列号。 当left < location[s[i]]
的时候,说明字符s[i]
出现了两次。需要设置 left = location[s[i]] + 1
, 保证字符s[i]
只出现一次。
Ⅱ
核心:只增大不减小的滑动窗口
流程:两个指针start
和end
表示窗口大小,遍历一次字符串,窗口在遍历过程中滑动或增大
tips:配合画图思考更佳
窗口内没有重复字符:此时判断i+1
与end
的关系,超过表示遍历到窗口之外了,增大窗口大小
窗口内出现重复字符:此时两个指针都增大index+1
,滑动窗口位置到重复字符的后一位
遍历结束,返回end-start
,窗口大小
思考:如果需要返回字符串怎么做?
解答:只需要在窗口增大的时候记录start
指针即可
题解
Ⅰ
1 | unc lengthOfLongestSubstring(s string) int { |
Ⅱ
1 | func lengthOfLongestSubstring(s string) int { |
总结
- 熟悉滑动窗口的用法