3. 无重复字符的最长子串
题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
提示:
- 0 <= s.length <= 5 * 104
- s 由英文字母、数字、符号和空格组成
解题思路
套用模板即可,因为只有一个字符串,所以模板还可以简化一下,不需要need
和valid
。
更新窗口内数据只要更新window内该字符出现的次数就可以了。
还要注意更新结果是在收缩窗口之后。要保证无重复字符串,那么哪一个窗口是没有重复的字符串呢?回头看一下我们收缩窗口的条件:存在重复元素
,所以我们收缩窗口之后的那个窗口是一定没有重复元素的。
代码
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> window = new HashMap<>();
int left = 0;
int right = 0;
int res = 0;//记录结果
while (right < s.length()) {
char c = s.charAt(right);
right++;
//进行窗口内数据的更新
window.put(c, window.getOrDefault(c, 0) + 1);
//说明有重复的字串出现,因为名称为c的字符出现的次数大于1了,不符合条件
while (window.getOrDefault(c, 0) > 1) {
char d = s.charAt(left);
left++;
//进行窗口内数据的更新
window.put(d, window.getOrDefault(d, 0) - 1);
}
//在这里更新答案
res = Math.max(res, right - left);
}
return res;
}
}