[题目链接](剑指 Offer II 016. 不含重复字符的最长子字符串)
思路
- 双指针
- 用hashmap存字符和它第一次出现的下标。
- 若右指针遍历到的字符已经出现了,先将该字符出现的第一次位置之前的字符全部清除,左指针移该字符出现的第一次位置的下一个位置。
代码
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length() == 0) return 0;
int ans = 1;
int left = 0;
int right = 1;
Map<Character,Integer> count = new HashMap<Character,Integer>();
count.put(new Character(s.charAt(0)),0);
for(; right < s.length(); right++){
if(count.containsKey(s.charAt(right))){
ans = Math.max(ans,right-left);
int left2 = count.get(s.charAt(right)) + 1;
for(int i = left; i < left2; i++) {
count.remove(s.charAt(i));
}
left = left2;
} else {
ans = Math.max(ans,right-left+1);
}
count.put(new Character(s.charAt(right)),right);
}
return ans;
}
}