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.
该题目是一道典型的滑窗题;也可以理解为动态规划题,动态调整窗口大小。
O(n2)的解法也能解决该问题(没有试过,不知道会不会TimeOut),一开始在第八行,即 i = Math.max(map.get(s.charAt(j)) + 1, i)处没有处理好,没有加入max限制条件,使得abba这类的计算窗口出现异常,过滤后可AC。
class Solution {
public int lengthOfLongestSubstring(String s) {
int strLen = s.length();
Map<Character, Integer> map = new HashMap<>();
int i = 0, retLen = -1;
for (int j = 0; j < strLen; ++ j){
if (map.containsKey(s.charAt(j))){
i = Math.max(map.get(s.charAt(j)) + 1, i);
}
retLen = Math.max(j - i, retLen);
map.put(s.charAt(j), j);
}
return retLen + 1;
}
}