LeetCode 3:無重複字符的最長字串

題目

給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度

示例

輸入: “pwwkew”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “wke”,所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。

代碼

解法一(很暴力)

在位置i,假設當前元素位置爲最長子串的末尾,往前比較,直到遇到與它相同的元素,用那個元素的位置更新index(往前比較的停止點),如果此時子串的長度大於最大長度,則更新長度。循環往後。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s==null||s.length()==0){
            return 0;
        }
        //只有一個字符
        if(s.length()==1){
            return 1;
        }
        //至少有兩個字符
        int res = 0;
        //index表示新子串的開頭(保證從index到當前位置之前沒有重複的字符)
        int index = 0;
        //從第2個字符開始往前找
        for(int i=1;i<s.length();i++){
            //從當前位置往前找,到index爲止,看字符是否重複
            for(int j=i-1;j>=index;j--){
                //有重複
                if(s.charAt(j)==s.charAt(i)){
                    index = j+1;
                    res = Math.max(res,i-index+1);
                    break;
                }
            }
            //沒有重複
            res = Math.max(res,i-index+1);
        }
        return res;
    }
}

解法二(也很暴力)

和解法一思路一樣,區別是遍歷一次字符串,藉助一個Hashmap

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s==null||s.length()==0){
            return 0;
        }
        //記錄出現過的字符及其下標
        HashMap<Character,Integer> map = new HashMap<>();
        int res = 0;
        //index表示新子串的開頭(保證從index到當前位置之前沒有重複的字符)
        int index = 0;
        for(int i=0;i<s.length();i++){
            char c = s.charAt(i);
            //從index往後,看當前字符是否出現過,出現過則更新index
            if(map.get(c)!=null&&map.get(c)>=index){
                index = map.get(c)+1;
            }
            //沒出現過,則加入map
            map.put(c,i);
            // index 到 i 就是當前字符串,長度爲 i-index+1             
            res = Math.max(res,i-index+1);
        }
        return res;
    }
}

解法三

官方題解(不想敲了)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章