剑指 Offer 48. 最长不含重复字符的子字符串
题目链接:剑指 Offer 48. 最长不含重复字符的子字符串
方法:同向双指针
解题思路
- 初始化l = 0, r = 0;
- 右指针右移,直到[l, r]之间出现重复字符,然后将左指针右移,直到[l, r]之间没有重复字符;
- 即保证[l, r]窗口无重复字符,然后计算最大的窗口长度。
代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int l = 0, r = 0, n = s.length(), ans = 0;
int mask[128];
memset(mask, 0, sizeof(mask));
while (r < n) {
if (!mask[s[r] - ' ']) { // 新的字符
mask[s[r] - ' '] = 1;
r ++ ;
} else { // 出现重复字符
ans = max(ans, r - l); // 计算区间长度
while (l < r && s[l] != s[r]) { // 缩小区间,直到无重复字符
mask[s[l] - ' '] = 0;
l ++ ;
}
mask[s[l] - ' '] = 0;
l ++ ;
}
}
ans = max(ans, r - l);
return ans;
}
};
复杂度分析
时间复杂度:\(O(n)\);
空间复杂度:\(O(1)\)。

浙公网安备 33010602011771号