class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character,Integer> map = new HashMap<>();
int len = s.length();
int ans = 0;
char[] c = s.toCharArray();
/* c[] p w w k e w
key 0 0 0 0 0 0
value 0 0 0 0 0 0 ans=0 start=0 end=0
key p 0 0 0 0 0 p
value 1 0 0 0 0 0 ans=1 start=0 end=0
key p w 0 0 0 0 p w
value 1 2 0 0 0 0 ans=2 start=0 end=1
key p w 0 0 0 0 w
value 1 3 0 0 0 0 ans=2 start=2 end=2
key p w k 0 0 0 w k
value 1 3 4 0 0 0 ans=2 start=2 end=3
key p w k e 0 0 w k e
value 1 3 4 5 0 0 ans=3 start=2 end=4
key p w k e 0 0 w k e w
value 1 6 4 5 0 0 ans=3 start=3 end=5
*/
for(int start = 0, end = 0; end < len; end++){
if(map.containsKey(c[end])){
start = Math.max(start, map.get(c[end]));
//start = map.get(c[end]); 错误写法
}
map.put(c[end],end+1);
ans = Math.max(ans, end-start+1);
}
return ans;
}
/* c[] a b b a
key 0 0 0 0
value 0 0 0 0 ans=0 start=0 end=0
key a 0 0 0 a
value 1 0 0 0 ans=1 start=0 end=0
key a b 0 0 a b
value 1 2 0 0 ans=2 start=0 end=1
key a b 0 0 b
value 1 3 0 0 ans=2 start=2 end=2
map.containsKey(c[end]) == true
map.get(c[end]) -> map.get(c[3]) -> map.get('a') -> 1
此时 map.get(c[end]) < start 注意这种情况,所以start = Math.max(start, map.get(c[end]));
要这样写,充分说明了不是所有情况下map.get(c[end])总是那个较大值。
key a b 0 0 ba
value 1 ? 0 0 ans=? start=? end=3
*/
}