最大子字符串,哈希,O(n)

Description

Given a string, find the length of the longest substring without repeating characters.

Examples:

Given "abcabcbb", the answer is "abc", which the length is 3.

Given "bbbbb", the answer is "b", with the length of 1.

Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring"pwke" is a subsequence and not a substring.

Solution

1. 用max表示到目前爲止的最大子字符串的長度,用tmp記錄當前字符結尾的最大子字符串長度,用hash[arr[i]]表示第i個字符arr[i]最後一次出現的索引加1( 考慮到hash數組初始值均爲0),例如對於"abcbacbb",當索引(從0開始)爲2時,char=‘c’, max = 3, tmp = 3(對應abc). 當索引爲3時,char='b', max = 3, tmp = 2(對應cb);

2. 每次迭代當索引爲index時,判斷當前字符是否已經出現過,如果未出現過,則tmp = tmp + 1, 如果已出現過,則tmp = min(tmp + 1, index + 1 - hash[arr[i]]);

3. 每次迭代索引爲index時,更新hash,hash[arr[index]] = index + 1(考慮到hash數組初始值均爲0);

Code

	public int maxSubstring(String s) {
		char[] arr = s.toCharArray();
		// 'hash' saves the index of character at the last seen
		int[] hash = new int[255];
		int max = 0;
		// 'tmp' is the length of the longest subString with the end of 'arr[i]' at the time 
		for (int i = 0, tmp = 0; i < s.length(); i++) {
			tmp = Math.min(i + 1 - hash[arr[i]], tmp + 1);
			max = Math.max(tmp, max);
			hash[arr[i]] = i + 1;
		}
		return max;
	}



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