题目地址:
https://www.acwing.com/problem/content/57/
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从a
到z
的字符。
数据范围:
输入字符串长度
[
0
,
1000
]
[0,1000]
[0,1000]。
双指针。代码如下:
#include <cstring>
using namespace std;
class Solution {
public:
int longestSubstringWithoutDuplication(string s) {
int res = 0, c[26], cnt = 0;
memset(c, 0, sizeof c);
for (int i = 0, j = 0; i < s.size(); i++) {
c[s[i] - 'a']++;
if (c[s[i] - 'a'] == 1) cnt++;
// 如果有重复字母,就收缩左端点
while (cnt < i - j + 1) {
c[s[j] - 'a']--;
if (!c[s[j++] - 'a']) cnt--;
}
res = max(res, i - j + 1);
}
return res;
}
};
时间复杂度 O ( n ) O(n) O(n), n n n为字符串长度,空间 O ( 1 ) O(1) O(1)。