【LeetCode】無重複字元的最長子串
阿新 • • 發佈:2018-12-16
斷斷續續的,也在寫點LeetCode上的題(當然是偏簡單的那種啦)。就順便把自己解題的一些思路粘在這裡吧。
無重複字元的最長子串
給定一個字串,找出不含有重複字元的最長子串的長度。 示例 1: 輸入: “abcabcbb” 輸出: 3 解釋: 無重複字元的最長子串是 “abc”,其長度為 3。
示例 2: 輸入: “bbbbb” 輸出: 1 解釋: 無重複字元的最長子串是 “b”,其長度為 1。
示例 3: 輸入: “pwwkew” 輸出: 3 解釋: 無重複字元的最長子串是 “wke”,其長度為 3。請注意,答案必須是一個子串,“pwke” 是一個子序列 而不是子串
~~
首先,從前往後依次遍歷輸入字串的各個元素。所有的操作都是在這次遍歷中完成的。 嗯,我們仍然可以用雜湊的方法。宣告一個數組hashTale[128],初始化為0。在遍歷的過程中,將出現的字元(作為下標)對應的元素進行自增操作,同時子串長度++。若其自增後超過了1,結束本次子串的錄入(記本子串的長度為最大MAX)。格式化hashTable[128],接著遍歷,從新開始子串的錄入。若從新開始錄入的子串長度超過了預定的MAX,將其值賦給MAX。 這樣直至遍歷結束,返回MAX。 關於子串的從新錄入,有一點細節要補充。錄入的起點應為遍歷的當前字元前一次出現的位置,的後一個位置(這裡我進行了倒序遍歷查詢)。是不是有點拗口。。。這樣又產生了下標可能越界的問題。 嗯……LeetCode的題寫起來挺吃力的…… 最後終於把這個中等難度的題AC了
完整程式碼:
import java.util.Scanner; public class LongestSubstring { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("請輸入一串字元> "); String original = input.next(); int MAX = lengthOfLongestSubstring(original); System.out.println(MAX); } public static int lengthOfLongestSubstring(String s) { int[] hashTable = new int[128]; int MAX = 0, subLength = 0; int length = s.length(); for(int i = 0; i < length;) { hashTable[s.charAt(i)]++; if(hashTable[s.charAt(i)] == 1) { subLength++; } else { MAX = MAX > subLength ? MAX : subLength; subLength = 1; for(int j = i - 1; j >= 0; j--) { if(s.charAt(j) == s.charAt(i)) { i = j + 1; break; } } if(i >= length) { break; } else { for(int j = 0; j < 128; j++) { if(j == s.charAt(i)) hashTable[j] = 1; else hashTable[j] = 0; } } } i++; } MAX = MAX > subLength ? MAX : subLength; return MAX; } }