1. 程式人生 > >3. Longest Substring Without Repeating Characters尋找不重復的最大子串

3. Longest Substring Without Repeating Characters尋找不重復的最大子串

如果 檢測 多重 urn bre [] i++ set out

首先弄清楚Substring和Subsequence,前者是子串,要求連續,後者是子序列,可以不連續

public int lengthOfLongestSubstring(String s) {
        /*
        一開始自己想的方法:兩個指針,一個作為開始,一個用來遍歷,復雜度O(N)
         */
        int l = s.length();
        if (l==0)
            return 0;
        char[] str = s.toCharArray();
        int res = 1;
        Set
<Character> set = new HashSet<>(); for (int i = 0; i < l-1; i++) { set.add(str[i]); for (int j = i+1; j < l; j++) { if (set.contains(str[j])) break; set.add(str[j]); res = Math.max(res,set.size()); } set.clear(); }
return res; } public int lengthOfLongestSubstring2(String s) { /* O(N)做法,自己建立哈希表來記錄有沒有出現過,第一次接觸這種做法,要記住 思路就是用哈希表記錄當前字符最近一次出現時的index 如果沒出現重復字符串就繼續遍歷,每次更新res長度 如果出現了重復,那就把最左邊的坐標移到前邊重復數字的下一個,然後繼續遍歷,res一直是記錄最大長度 與這種做法相比,第一種做法每次都會遍歷很多重復的子串 */
//所有字符都能轉化為256以內的int值,這樣就可以記錄所有字符 int[] index = new int[256]; Arrays.fill(index,-1); //記錄 最左邊坐標 int left = 0; //記錄結果 int res = 0; for (int i = 0; i < s.length(); i++) { //先檢測有沒有重復字符,如果,left更新,比較的方法是把哈希表中的記錄和left比較,取大的。如果沒有出現過,那麽哈希表中的記錄是-1,肯定是left大 //如果出現過,有兩種情況,一種是記錄沒有left大,說明是和left 之前的一個重復了,這種情況沒有影響 ,另一種是比left大,這樣就會影響長度的判斷,要更新left left = Math.max(left,index[s.charAt(i)+1]); //更新哈希表 index[s.charAt(i)] = i; res = Math.max(res,i-left+1); } return res; }

3. Longest Substring Without Repeating Characters尋找不重復的最大子串