天天一道算法題:無重複字符的最長子串

題目

給定一個字符串,找出不含有重複字符的 最長子串 的長度。數組

示例:bash

  • 給定 "abcabcbb" ,沒有重複字符的最長子串是 "abc" ,那麼長度就是3。ui

  • 給定 "bbbbb" ,最長的子串就是 "b" ,長度是1。spa

  • 給定 "pwwkew" ,最長子串是 "wke" ,長度是3。請注意答案必須是一個子串,"pwke" 是 子序列 而不是子串。指針

方案1

思路: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;
    }
}
複製代碼

方案2

思路: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;  
    }  
複製代碼
相關文章
相關標籤/搜索