题解 | #最长不含重复字符的子字符串#
最长不含重复字符的子字符串
http://www.nowcoder.com/practice/48d2ff79b8564c40a50fa79f9d5fa9c7
动态规划+哈希表,看到很多题解都用了数组来保存当前为结尾的最长结果,其实可以更加优化。当出现重复字符时,只需要更新最近的相同字符作为长度计算起点,然后每次更新最长不同字符字串长度值即可。
int start = -1, sub = 1;
//哈希表存储字符和字符位置的对应关系
HashMap<Character,Integer> chara = new HashMap<Character,Integer>();
//遍历字符串
for(int i = 0;i < s.length();i++){
if(chara.containsKey(s.charAt(i))){
//更新最近的相同字符作为长度计算起点
start = Math.max(start,chara.get(s.charAt(i)));
}
chara.put(s.charAt(i),i);
//更新最长不同字符字串长度值
sub = Math.max(sub,i - start);
}
return sub;