抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

中等题目

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

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

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


提示:
0 <= s.length <= 5 * 10^4
s 由英文字母、数字、符号和空格组成
最开始解法

初步判断为滑动窗口,记录最长字串和最长长度,然后不断右移和缩动窗口

技术栈:
字符串分割 String.substring(prev, last)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public int lengthOfLongestSubstring(String s) {
String subs = "";
int ans = 0;
for (int i=0;i<s.length();i++) {
char c = s.charAt(i);
int findIndex = subs.indexOf(String.valueOf(c));
if (findIndex == -1) {
subs += c;
ans = Math.max(ans, subs.length());
} else {
ans = Math.max(ans, subs.length());
subs = subs.substring(findIndex + 1, subs.length()) + c;
}
}
return ans;
}
}

时间 12ms

使用滑动窗口框架解法

使用hash记录字符出现次数,出现重复字符则滑动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> window = new HashMap<>();
int left = 0, right = 0;
int ans = 0;

while (right < s.length()) {
char c = s.charAt(right);
right++;
window.put(c, window.getOrDefault(c, 0) + 1);

while (window.get(c) > 1) {
char lc = s.charAt(left);
left ++;
window.put(lc, window.get(lc) -1);
}

ans = Math.max(ans, right - left);
}

return ans;
}
}

时间 6ms

评论