剑指48:最长不含重复字符的子字符串

传送门

nowcoder
leetcode

题目描述

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

C++ 代码 - nowcoder

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*
哈希表 + 双指针

时间复杂度:O(n)
*/
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int length = s.size();
if (length <= 1) return length;

unordered_set<char> set;
int res = -1, right = 0;
for (int left = 0; left < length; left ++) {
while (right < length && !set.count(s[right])) {
set.insert(s[right]);
right ++;
}
res = max(res, right - left);
set.erase(s[left]);
if (right >= length) break;
}

return res;
}
};

/*
滑动窗口

时间复杂度:O(n)
*/
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> window;

int left = 0, right = 0;
int res = 0; // 记录结果
while (right < s.size()) {
char c = s[right];
right ++;
// 窗口内的数据进行更新
window[c] ++;
// 判断左侧窗口是否需要收缩
while (window[c] > 1) {
char t = s[left];
left ++;
// 窗口内的数据进行更新
window[t] --;
}
// 更新答案
res = max(res, right - left);
}
return res;
}
};

C++ 代码 - leetcode

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
/*
滑动窗口

时间复杂度:O(n)
*/
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> window;

int left = 0, right = 0;
int res = 0; // 记录结果
while (right < s.size()) {
char c = s[right];
right ++;
// 窗口内的数据进行更新
window[c] ++;
// 判断左侧窗口是否需要收缩
while (window[c] > 1) {
char t = s[left];
left ++;
// 窗口内的数据进行更新
window[t] --;
}
// 更新答案
res = max(res, right - left);
}
return res;
}
};

剑指48:最长不含重复字符的子字符串
https://lcf163.github.io/2021/02/01/剑指48:最长不含重复字符的子字符串/
作者
乘风的小站
发布于
2021年2月1日
许可协议