P3 无重复字符的最长子串


image-20210531154521739

题解

  • 一道滑动窗口问题
  • 自己摸索着倒是做出来了,但是…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> map = new HashMap<>();
int max = 0;
int temp = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(!map.containsKey(c)){
map.put(c,i);
temp++;
}else{
i = map.get(c);
map.clear();
max = Math.max(max, temp);
temp = 0;
}
}
max = Math.max(max, temp);
return max;
}
}

image-20210531162135918

改进

  • 使用左右边界,边界包含的字符串应是无重复的
  • 这样只需右边界减去左边界+1即可获得字符串长度(如果是尾后迭代器,作差返回的就是区间长度,如果两边都是闭区间的话就得+1)
  • 只需要用Set来保存出现过的字符即可
  • 左边界移动时删除set中原来位置的字符
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) {
Set<Character> set = new HashSet<>();
int n = s.length();
int right = -1;
int max = 0;
for (int i = 0; i < n; i++) {
if(i!=0){
set.remove(s.charAt(i-1));
}
while (right+1<n && !set.contains(s.charAt(right+1))) {
set.add(s.charAt(right+1));
++right;
}
max = Math.max(max, right - i+1);
}
return max;
}
}

image-20210531162052441

  • 比较奇怪的是只是改变了边界为左闭右开性能居然下降了,于是又试了一次
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) {
Set<Character> set = new HashSet<>();
int n = s.length();
int right = 0;
int max = 0;
for (int i = 0; i < n; i++) {
if(i!=0){
set.remove(s.charAt(i-1));
}
while (right<n && !set.contains(s.charAt(right))) {
set.add(s.charAt(right));
++right;
}
max = Math.max(max, right - i);
}
return max;
}
}

image-20210531162829560

image-20210531163016227

  • 看来不能太相信这个…

← Prev P1744 你能在你最喜欢的那天吃到你最喜欢的糖果吗? | P342 4的幂 Next →