滑动窗口
public static int lengthOfLongestSubstring(String s) {
if (s==null)
return 0;
Set<Character> set=new HashSet<>();
//窗口长度
int len=s.length();
//左右窗口
int left=0;
int right=0;
//最大窗口长度
int max=0;
//没超出最大窗口长度时:
while (left<len){
//第一次执行,当while中窗口遇到重复字母时,用来删除重复字母用
if (left!=0){
set.remove(s.charAt(left-1));
}
//一次性测出当前窗口可扩大的最大长度
while (right<len&&!set.contains(s.charAt(right))){
set.add(s.charAt(right));
right++;
}
//每一次测试完扩大窗口,都要去跟新最大窗口长度
max=Math.max(max,right-left);
//测试用例
//System.out.println("right:"+right+" left:"+left+" max:"+max);
//每一次遇到重复元素,都要移动左窗口
left++;
}
return max;
}
学以致用
当前题目窗口框架:
右窗口没有走到头时:
- 1、右窗口一直向前走,直到遇到重复元素
- 2、此时跟新最大窗口长度
- 3、左窗口向右移动一个,并且删除当前左窗口对应的Set中元素
- 4、如果还是有重复元素,继续第三步
- 5、如果没有重复元素,继续第一步