==官方的题解思路:==遍历每个字符,利用hashset记录每次的“滑动窗口”的存放字符,记录每次的长度和当前的最大值进行比较。外层循环移动窗口的左指针----保证了遍历了所有的情况,内循环移动窗口的右指针!!!!
class Solution {
//充分利用hashset的不重复特性+滑动窗口
public int lengthOfLongestSubstring(String s) {
int ans=0;
int right=-1;//从-1开始
//这是一个存放滑动窗口的没有重复字符的容器
Set<Character> hashset=new HashSet<>();
/**
*i 是滑动窗口的左指针
*right 是滑动窗口的右指针
*/
for(int i=0;i<s.length();i++){
if(i!=0){
hashset.remove(s.charAt(i-1));//删除前一个字符串的第一字符继续判断(滑动窗口的左指针移动)
}
//注意这个right指针不需要重置,因为i到right(第i-1次的右指针)的窗口也没有重复的字符串, hashset的原因
while((right+1)<s.length() && !hashset.contains(s.charAt(right+1))){
right++;//滑动窗口的右指针移动
hashset.add(s.charAt(right));
}
ans=Math.max(ans,hashset.size());
}
return ans;
}
}