在原答案基础上加入了一些自己的注释。原文在这里
public class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
Map<Character, Integer> map = new HashMap<>();
// current index of character
// try to extend the range [i, j]
for (int j = 0, i = 0; j < n; j++) {
if (map.containsKey(s.charAt(j))) {
//如果遇到了重复的字符,就根据map中存储的上一个重复字符
//的位置更新start,否则start不变
i = Math.max(map.get(s.charAt(j)), i);
}
//不能放在if语句内,因为可能没有重复字符
ans = Math.max(ans, j - i + 1);
//对于与前边重复的字符,将新的与前边重复的字符放入map,利用map的key唯一性,
//保证map中存储的是[i,j)滑动方向上最靠后的字符,这样就不会回到前边查看过的
//字符了。j+1是在遇到重复字符时下一个start
map.put(s.charAt(j), j + 1);
}
return ans;
}
}