原题:Given a string, find the length of the longest substring without repeating characters.
第一次做采取的是暴力的依次搜索每一个位置上的最长不重复子串,时间复杂度为O(N*N);
这次在看了左老师的视频后,采用一次遍历,得到结果;
算法思路:
当前位置的最长不重复子串长度与上一位置的最长不重复子串长度有关;
算法步骤:
1.设置一个哈希表用于记录当前遍历到的字符上一次出现的位置;
2.设置一个与字符串等长的数组,用于记录每个位置最长不重复子串的长度;
3.遍历;
代码:
public class Solution {
public int lengthOfLongestSubstring(String s) {
char[] arr=s.toCharArray();
int Length=arr.length;
if(Length==0){
return 0;
}
int[] hArr=new int[Length];//存储以某元素为最右的最长不重复子串的长度;
hArr[0]=1;
Map<Character,Integer> map=new HashMap<Character,Integer>();//存储某字符上一次出现的位置;
map.put(arr[0],0);
for(int i=1;i<Length;i++){
if(map.get(arr[i])==null){
//一个新的字符,在哈希表中记录;
map.put(arr[i],i);
hArr[i]=hArr[i-1]+1;
}else{
//已存在的字符;
int subLeft=i-hArr[i-1];//左边界位置;
if(map.get(arr[i])<subLeft){
//上位置在左边界左;
hArr[i]=hArr[i-1]+1;
map.put(arr[i],i);//更新哈希表;
}else{
//上位置在左边界里,新的不重复子串由上位置决定;
hArr[i]=i-map.get(arr[i]);
map.put(arr[i],i);
}
}
}
//遍历完之后,取出hArr数组中的最大值;
int max=0;
for(int i=0;i<hArr.length;i++){
if(hArr[i]>max){
max=hArr[i];
}
}
return max;
}
}