【题干】
给定一个字符串 s
,找出其中不含有重复字符的 最长子串 的长度。
【思路】
考虑到需要查重,使用hashset尽量降低查找成本
用left和right记录当前窗口的左右边界,max记录当前窗口最大长度
依次将right位置的字符添加到集合中,若当前集合中不存在该字符,添加后直接处理下一个字符, 如果当前集合中已存在该字符, 依次删去左侧字符,直到被删除的字符即为当前添加字符, 此时集合中再次不存在重复字符。 在每轮循环操作结束后计算当前窗口大小,判断是否更新最大值。
【题解】
class Solution {
public int lengthOfLongestSubstring(String s) {
//维护当前最长不重复字符子串
Set<Character> set = new HashSet<>();
int left = 0;
int right = 0;
int max = 0;
while(right<s.length()){
if(!set.contains(s.charAt(right))){
//未查到重复字符就一直加,right右移
set.add(s.charAt(right));
right++;
}else{
//right查到重复字符先不动,left右移,set删left经过的字符,直到重复的这个字符删掉为止
set.remove(s.charAt(left));
left++;
}
//每一次计算当前set子串的长度
max = Math.max(max, set.size());
}
return max;
}
}