思路:就是用set存数据,之后两个指针i,j。其中i不断向后遍历,set中不断添加i++的元素,当set遇到重复元素,则j向后移动一位,同时删除j所在位置的的元素,并且比较此时长度
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s==null || s.length()== 0) return 0;
HashSet set=new HashSet();
int ret=0;
for(int i=0,j=0;i<s.length();i++){
if(!set.contains(s.charAt(i))){
set.add(s.charAt(i));
ret=Math.max(ret,set.size());
}else{
set.remove(s.charAt(j++));
}
}
return ret;
}
}
之后发现报错,aab这个输出为1,因为j后移会删除j++的值,那么a则不会存入进去,之后就开始看官方答案
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();
Set<Character> set = new HashSet<>();
int ans = 0, i = 0, j = 0;
while (i < n && j < n) {
// try to extend the range [i, j]
if (!set.contains(s.charAt(j))){
set.add(s.charAt(i++));
ans = Math.max(ans, set.size());
}
else {
set.remove(s.charAt(j++));
}
}
return ans;
}
}