算法-无重复字符的最长子串

描述

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

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

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

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

请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

解决方案

方法一:滑动窗口思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
/**
* 滑动窗口思路
* @param s
* @return
*/
public static int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0) {
return 0;
}
int len = s.length();
int res = 1;
HashSet<Character> occ = new HashSet<>();
for (int i = 0, j = i; i < len; i++) {
while (j < len && !occ.contains(s.charAt(j))) {
occ.put(s.charAt(j));
res = Math.max(res, j - i + 1);
j++;
}
if (j == len) {
return res;
}
occ.remove(s.charAt(i));
}
return res;
}

}

方法二:队列法

滑动窗口本质上也是队列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
/**
* 队列法
*
* @param s
* @return
*/
public static int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0) {
return 0;
}
//队列保存不重复的子串
Queue<Character> queue = new ArrayDeque<>();
//使用集合,保存已经添加的字符,用于判断重复,提高性能
HashSet<Character> occ = new HashSet<>();
int res = 1;
for (int i = 0; i < s.length(); ) {
char c = s.charAt(i);
if (!occ.contains(c)) {
queue.add(c);
occ.add(c);
i++;
res = Math.max(queue.size(), res);
} else {
Character cc = queue.poll();
occ.remove(cc);
}
}
return res;
}
}

算法-无重复字符的最长子串
http://example.com/2023/03/16/算法-无重复字符的最长子串/
作者
BiggerBrain
发布于
2023年3月16日
许可协议