3. Longest Substring Without Repeating Characters
刷 June-12-2019
直观做法是保持滑窗,滑窗内出现的字母用MAP记录位置。
单向扩大滑窗,发现已出现字母,要查上次出现的位置,移动左指针。
一开始考虑的是移动左指针之后,要从MAP中删除移动过程中的字母,其实不用,
因为继续的时候,发现MAP中的字母出现在滑窗外,证明是应该被删除的,所以需要更新最大值,但不应该把左指针移动到上次出现位置的下一个。
left = Math.max(left, map.get(c) + 1)就是上面描述的
public int lengthOfLongestSubstring(String s) {
if (s == null) return 0;
int res = 0;
Map<Character, Integer> dictMap = new HashMap<>();
int l = 0;
for (int i = 0; i < s.length(); i ++) {
char c = s.charAt(i);
if (dictMap.containsKey(c)) {
l = Math.max(l, dictMap.get(c) + 1);
}
res = Math.max(res, i - l + 1);
dictMap.put(c, i);
}
return res;
}