//滑动窗口法
class Solution {
public int lengthOfLongestSubstring(String s) {
int l = s.length();
if(l == 1) return 1;
int max = 0;
Map<Character, Integer> map = new HashMap<>();
int first = 0, second = 0;
while(first < l && second < l){
Character c = s.charAt(second);
if(!map.containsKey(c)){
map.put(c, second);
}else{
int index = map.get(c);
//注意这块儿要控制子串头指针不能跳到前面去
first = Math.max(first, index + 1);
map.put(c, second);
}
second++;
max = Math.max(second - first, max);
}
return max;
}
}
改进,用数组代替map存索引
class Solution {
public int lengthOfLongestSubstring(String s) {
int l = s.length();
if(l == 1) return 1;
int max = 0;
int[] indexArray = new int[128];
for(int i = 0; i < 128; i++){
indexArray[i] = -1;
}
int first = 0, second = 0;
while(first < l && second < l){
int c = s.charAt(second);
if(indexArray[c] == -1){
indexArray[c] = second;
}else{
int index = indexArray[c];
first = Math.max(first, index + 1);
indexArray[c] = second;
}
second++;
max = Math.max(second - first, max);
}
return max;
}
}