1. 程式人生 > >【LeetCode】無重複字元的最長子串

【LeetCode】無重複字元的最長子串

斷斷續續的,也在寫點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;
	}
}