给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"abc"
,所以其长度为 3。示例 2:
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是"b"
,所以其长度为 1。示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
/**
* 滑动窗口常用于处理连续子序列问题
* 设左右两个指针,右指针不断向右遍历字符串,左右指针距离就是子串长度
* 当右指针所指字母在子串中重复时,左指针不断右移,并删去左指针指向字母,直到不再重复
* 当右指针指向最后一位时,遍历结束。
*/
class Solution {
public int lengthOfLongestSubstring(String s) {
HashSet<Character> set = new HashSet();
int left = 0;
int right = 0;
int maxLen = 0;
while(right < s.length()){
//如果没重复,则在set中加入该字母,并更新最大长度
if(!set.contains(s.charAt(right))){
set.add(s.charAt(right));
right++;
maxLen = Math.max(maxLen, right - left);
}
//如果重复了,set将会不断删除左侧字母,直到不重复
else{
set.remove(s.charAt(left));
left++;
}
}
return maxLen;
}
}