题目描述
给定一个字符串 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
由英文字母、数字、符号和空格组成
题目分析
定义滑动窗口map
- 初始化
left = right = 0
,把索引左闭右开区间[left, right)
称为一个「窗口」。 - 我们先不断地增加
right
指针扩大窗口[left, right),同时更新窗口中的value值
如果map中存在重复字符,则停止增加right,转而不断增加left以缩小窗口。每次增加left都会对map中的值进行更新
重复步骤2和3,直到right达到字符串的尽头。
左右指针轮流前进,窗口大小增增减减,窗口不断向右滑动,这就是「滑动窗口」这个名字的来历。
解法
class Solution {
public int lengthOfLongestSubstring(String s) {
int res=0,left=0,right=0;
Map<Character,Integer> map=new HashMap<>();
while(right<s.length()){
char c=s.charAt(right);
right++;
map.put(c,map.getOrDefault(c,0)+1);
while(map.get(c)>1){
char d=s.charAt(left);
left++;
map.put(d,map.get(d)-1);
}
res=Math.max(res,right-left);
}
return res;
}
}