LeetCode/3. 无重复字符的最长子串

3. 无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

1
2
3
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

1
2
3
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

1
2
3
4
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

本题其实就是滑动窗口,但是每一步需要将当前字母存储在HashMap中,其中Key为当前字母,Value为当前字母的索引+1(这里加一是为了定位到重复字母的下一个位置),然后就是快指针不断后移,如果出现原先出现过的字母,就将慢指针移到最后一次出现重复字母位置的下一位,每次获取相对较大值,每次将当前字母索引加入HashMap中。

具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s.length() == 0) return 0;
int n = s.length();
int left = 0, right = 0;
int maxLength = 1;
Map<Character, Integer> map = new HashMap<>();
for (; right < n; right++) {
char temp = s.charAt(right);
if (map.containsKey(temp)) {
left = Math.max(left, map.get(temp));
}
maxLength = Math.max(maxLength, right - left + 1);
map.put(temp, right + 1);
}

return maxLength;
}
}

Comments