Given a string, find the length of the longest substring without repeating characters.
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.
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);
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; }