无重复字符的最长子串
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
1 | 输入: s = "abcabcbb" |
示例 2:
1 | 输入: s = "bbbbb" |
示例 3:
1 | 输入: s = "pwwkew" |
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
Related Topics
- 哈希表
- 字符串
- 滑动窗口
暴力解法
遍历数组的所有的区间,将满足题意区间长度的最大值返回
1 | class Solution { |
中间会有重复的比较
导致效率十分低下
当string长度十分大的时候,一定会导致超时
滑动窗口法
思路如下组图所示
示例代码 1
1 | class Solution { |
在这道题目中用set
来充当window
也是可以的
示例代码 2
1 | class Solution { |
但是这两种都不大好
这两种的window的定义都是s的[legft,right)
区间是不重复的子串
下面看window的定义是s的[left,right]
区间不是重复的子串的时候该如何写代码
示例代码 3
1 | class Solution { |
使用队列优化
1 | class Solution { |
使用map优化
我们发现对于处理left,需要遍历left往后走
那我们就可以使用map存一下,从而可以快速拿到窗口中重复的字符的那一个索引
1 | class Solution { |
对map再次进行优化
因为字符是确定的所以,我们可以new一个128长度的数组来当hashmap,键是字符的ascll码值,值是索引,代码如下
1 | class Solution { |