3_无重复字符的最长字串

难度:中等

题目

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

示例

示例一:

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

示例二:

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

示例三:

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

提示

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

解题

滑动窗口解法

用一个 HashMap 存储字符和出现的位置,然后遍历字符串。

遇到一个字符们首先判断是否存在于 map 中,如果不存在,将字符添加到 map 中,然后记录最大长度,最大长度就是当前位置下标 - 起点位置下标 + 1;如果存在,就更新起点位置下标。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public int lengthOfLongestSubstring(String s) {
if (s.length() == 0) return 0;
int maxLen = -1, left = 0;
// map 存储字符和出现的位置
HashMap<Character, Integer> map = new LinkedHashMap<>();
for (int i = 0; i < s.length(); i++) {
if (map.containsKey(s.charAt(i))) {
left = Math.max(left, map.get(s.charAt(i)) + 1);
}
map.put(s.charAt(i), i);
maxLen = Math.max(maxLen, i - left + 1);
}
return maxLen;
}