Longest Substring Without Repeating Characters Medium
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.
public int lengthOfLongestSubstring(String s) {
char[] sc = s.toCharArray();
Map<Character, Integer> cm = new HashMap<Character, Integer>();
int j = 0, maxLen = 0;
for (int i = 0; i < sc.length; ++i) {
char cur = sc[i];
if (cm.containsKey(cur)) {
maxLen = Math.max(i - j, maxLen);
j = Math.max(j, cm.get(cur) + 1);
}
cm.put(cur, i);
}
return Math.max(sc.length - j, maxLen);
}
思路:滑动窗口。以j计左界限,每次出现重复字后移动到该字后一位。其实只需要前面出现过的重复字符的下标即可算出此段不重复子段的长度,核心操作其实是向前检索重复字符。需要注意的是最后循环完成后,需要再算一下没有计算的那段的长度,在这些子段中取最长的。O(n)