LeetCode 149 Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

分析:見到非重複,應該想到Hash。

這題可以用HashMap來存放字符和對應下標的關係,然後遍歷,如果遇見重複的,就可以直接找到上一個重複字符的出現位置,把之前的全部清0.

怎麼把之前的全部清除呢?

這裏用一個start變量,記錄當前字符串開始的位置,如果碰見重複的,則從start開始,從HashMap裏移除現有值,直到重複的字符,就實現了對之前元素的清除。

public class Solution {
    public int lengthOfLongestSubstring(String s) {
        
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        int max = 0;
        int start = 0;
        for(int i=0; i<s.length(); i++){
            char c = s.charAt(i);
            if(map.containsKey(c)){
                max = Math.max(max, map.size());
                for(int j=start; j<i; j++){
                    if(s.charAt(j) == c){
                        start = j+1;
                        break;
                    }
                    map.remove(s.charAt(j));
                }
            }else{
                map.put(c, i);
            }
        }
        return Math.max(max, map.size());
    }
}

下面解法,用的是桶排得思想,假設全部爲ASCII字符,用一個長256的數組當字典,原理和Hash是一樣的,侷限是假定字符都是ASCII的。

public class Solution {
    public int lengthOfLongestSubstring(String s) {
        boolean[] flag = new boolean[256];
        
        int result=0;
        int j=0;
        char[] arr = s.toCharArray();
        
        for(int i=0; i<arr.length; i++){
            char c = arr[i];
            if(flag[c]){//如果爲真,說明已經存過
                result = Math.max(result, i-j);
                for(int k=j; k<i; k++){
                    if(arr[k]==c){//找到c的下標,更新j
                        j=k+1;
                        break;
                    }
                    flag[arr[k]]=false;
                }
            }else
                flag[c]=true;
        }
        result = Math.max(arr.length-j,result);
        return result;
    }
}


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