给定一个字符串 s
,请你找出其中不含有重复字符的最长子串的长度。
子串嘛,有起始和结束,结束减掉起始再加1就是子串的长度,起始位置好说,先以第一个字符开始,依次检查是否前方已有该字符,要检查重复那么就需要将之前遍历过的所有字符存起来,如果光是检验是否重复List已经足够,但我们需要找到被匹配到的重复的字符所在的位置,以便下次将该字符跳过就不会让该字符再次在同样的位置重复。最长子串就是找到后和之前的最长进行比较,如果更大则替代掉原来的,代码如下:
public int lengthOfLongestSubstring(String s) {
if(s.length()<=1){
return s.length();
}
char[] arr=s.toCharArray();
int max=1;
int i=0;
while(i<arr.length-1){
int j=i+1;
Map<Character,Integer> map=new HashMap<>();
map.put(arr[i],i);
int begin=i;
while(j<arr.length){
if(!map.containsKey(arr[j])){
map.put(arr[j],j);
j++;
}else{
begin=map.get(arr[j]);
break;
}
}
if(j-i>max){
max=j-i;
}
i=begin+1;
}
return max;
}
效率上只打败了7%的人,看来还是有很大的优化空间,欢迎大佬指出问题所在,大家相互交流,互相学习。