using Java; 最长子串问题;滑动窗口
题目
Given a string, find the length of the longest substring without repeating characters.
难度
medium(做错次数比较多,没有理解清晰滑动窗口)
思路
- 设置一个滑动窗口,一个左闭右开区间,[i,j)表示当前子串,j-i即为当前子串的长度
- 为了使时间复杂度达到O(n),使用一个循环(窗口右侧达到字符串末尾时终止),一个hashset(判断下一个字符是不是在当前子串可以找到)
- 如果set中找不到当前字符:加入set; j++
- 如果set中找到当前字符:移出set中第一个字符;i++
代码
class Solution {
public int lengthOfLongestSubstring(String s) {
Set<Character> set=new HashSet<>();
int maxl=0,i=0,j=0;
while(j<s.length()){
if(!set.contains(s.charAt(j))){
set.add(s.charAt(j));
j++;
maxl=Math.max(maxl,j-i);
}else{
set.remove(s.charAt(i));
i++;
}
}
return maxl;
}
}
注意点
- 初始窗口中没有字符,i=0; j=0
- 左闭右开区间是关键,不然繁琐且易错
- set中找到当前字符x时,不是移出该字符x!而是移出第一个字符,然后再进入循环,判断set中是否有字符x