思路:
"无重复"可以想到HashSet,但是HashSet无法获取到长度,所以可以用HashMap记录下标,获取长度
代码:
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length()==0||s==null) return 0;
int max=0;
HashMap<Character,Integer> map=new HashMap();
for(int k=0,m=0;k<s.length();k++){
if(map.containsKey(s.charAt(k))){
//与HashSet不同的是,HashMap一遇到重复的慢指针的就直接跳转,不用一个一个删除
//而有一个注意点是要防止跳转回去,所以用Math.max判断
m=Math.max(m,map.get(s.charAt(k))+1);
}
//把所有值都存进去,否则无法判断是否重复了
map.put(s.charAt(k),k);
//HashMap没有HashSet的set.size()函数
max=Math.max(max,k-m+1);
}
return max;
}
}
分解:
1)HashMap存储,key存字符,value存下标
2)判断有重复时,利用常量m记录左边界的位置,注意:这里需要判断当前i与之前的左边界哪一个更大,防止回去了
这里左指针就是s.charAt(k)+1,比重复字符过去一个字符
m=Math.max(m,map.get(s.charAt(i))+1);
3)要把所有值都存进去,否则无法判断是否重复了
4)每次循环都要比较最大值(i-m+1)
复杂度分析:
时间复杂度:O(N)遍历一次,把N全部遍历一遍
空间复杂度:O(N)map存储所有的元素