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;
}