这段程序在for (int j = index; j < map.get(ch[i]) + 1; j++)会报空指针异常,为什么
import java.util.*;
class Solution {
public static int lengthOfLongestSubstring(String s) {
char[] ch = s.toCharArray();
Map<Character, Integer> map = new HashMap<>();
int index = 0;// 子串开始的角标
int res = 0;
for (int i = 0; i < ch.length; i++){
if (map.containsKey(ch[i])){
res = Math.max(res, i - index);
// System.out.println(i);
// System.out.println(index);
// System.out.println(res);
System.out.println(map.get(ch[i]));
for (int j = index; j < map.get(ch[i]) + 1; j++){
map.remove(ch[j]);
}
index = map.get(ch[i]) + 1;
} else {
map.put(ch[i], i);
}
}
return res;
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println(lengthOfLongestSubstring("avvab"));
}
}
要明白DEBUG的重要性。
for (int j = index; j < map.get(ch[i]) + 1; j++)
把+1去掉
当你执行map.remove(ch[j]) 时集合map会清除掉重复数据:"v",
在你for循环执行map.get(ch[i]) 时get不到这个"v",所以报空指针
你可以把map.get(ch[i]) 提出循环,
Integer integer = map.get(ch[i]);
这样循环就不会重复执行get方法,避免空指针.
(一般不建议在循环方法里对集合大小进行操作)
你的for循环中在调map的第i个元素时,上一次循环把第j个元素清除了,在最后一次的时候就出现了一个空指针,你可以控制一下循环次数