給定一個字符串,找出不含有重複字符的 最長子串 的長度。數組
示例:bash
給定 "abcabcbb" ,沒有重複字符的最長子串是 "abc" ,那麼長度就是3。ui
給定 "bbbbb" ,最長的子串就是 "b" ,長度是1。spa
給定 "pwwkew" ,最長子串是 "wke" ,長度是3。請注意答案必須是一個子串,"pwke" 是 子序列 而不是子串。指針
思路:code
字符對應的數字做爲下標字符串
初始化一個255的boolean做爲全部可能出現的字符對應的存在可能性,不存在重複的均爲false,存在重複的,則對應的下標置爲true。get
兩個指針進行移動,前指針先不動,後指針移動並根據當前字符對應整數下標是否爲false或者true進行判斷。若是是false,則表示沒有重複,則指針向後移動一位;若是爲true,表示存在重複,則後指針中止移動,並計算當前字串長度,且將boolean數組重置,第一個指針向前移動一位,後指針指向當前前指針。string
class Solution {
public int lengthOfLongestSubstring(String s) {
int len = 0 ;
if (s==null || s.length()== 0 )
{
return 0;
}
if (s.length() == 1){
return 1;
}
int firstPoint = 0;
int nextPoint = 0;
boolean[] exist=new boolean[255];
while (nextPoint < s.length()&&firstPoint <s.length()){
int currMax = 0;
int index = s.charAt(nextPoint)-0;
while (exist[index] == false&&nextPoint<s.length()){
exist[s.charAt(nextPoint)-0] = true;
nextPoint++;
if (nextPoint < s.length()){
index = s.charAt(nextPoint)-0;
}
}
currMax = Math.max(currMax,nextPoint-firstPoint);
firstPoint++;
nextPoint=firstPoint;
len = Math.max(len,currMax);
for (int i = 0 ; i < 255 ; i++)
{
exist[i] = false;
}
}
return len;
}
}
複製代碼
思路:hash
以一個hashmap做爲輔助,map的key存儲的是字符,value存儲的是該字符當前的位置,首先設置一個頭指針,指向字符串開頭,那麼從開始遍歷字符串,若是map當中不包含這個字符,那麼用這個字符當前所在的位置減去頭指針的位置,而後與最大長度作比較,選打的成爲最大長度,而後把當前字符的以及位置放入map,以abba爲例,頭指針指向a,當前爲a,那麼長度爲1,map。put(‘a’,0),當前爲b,那麼長度爲2,map.put('b',1),若是說map中存在當前字符,那麼把頭指針指向,頭指針當前的位置與map中存儲該字符位置的下一個位置當中的較大者,成爲新的頭指針位置,好比當走到第二個b的時候,那麼頭指針原來是0,當前map中存放b的位置是1,那麼頭指針指向2,因此長度爲1,比最大長度小不進行替換,最後將當前的字符及位置放入map,如今是map.put('b',2),而後走到了a,那麼當前map中a的位置是0,那麼它的下一個位置是1,與當前頭指針位置2相比,小於當前頭指針的位置,那麼頭指針不跟新,因此長度爲2,與最大長度相等,因此不替換,最後求出最大長度爲2.
public static int lengthOfLongestSubstring(String s) {
Map<Character,Integer> map=new HashMap<Character,Integer>();
int maxLength=0;
int now=0;
for(int i=0;i<s.length();i++){
if(map.containsKey(s.charAt(i))){
now=Math.max(map.get(s.charAt(i))+1,now);
if((i-now+1)>maxLength){
maxLength=i-now+1;
}
}else{
if((i-now+1)>maxLength){
maxLength=i-now+1;
}
}
map.put(s.charAt(i), i);
}
return maxLength;
}
複製代碼