上期回顾
在之前的滑动窗口练习中,我们处理过类似最小覆盖子串的问题。滑动窗口的核心套路其实相对固定,关键在于如何维护窗口内的状态。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n = nums.size();
int left = 0, right = 0, length = n + 1, sum = 0;
while (right < nums.size()) {
sum += nums[right];
while (sum >= target) {
length = min(right - left + 1, length);
sum -= nums[left++];
}
right++;
}
return length == n + 1 ? 0 : length;
}
};
本期题目:无重复字符的最长子串
问题描述
给定一个字符串 s,请你找出其中不含有重复字符的 最长子串 的长度。
关键点分析
- 无重复:窗口内字符不能重复出现。
- 统计频次:需要知道每个字符出现的次数(使用哈希表)。
- 最长:目标是最大化窗口长度。
- 子串:必须是连续的,不能跳跃。
暴力解法
最直观的思路是枚举所有可能的子串,检查是否包含重复字符。
双重循环 + 哈希表统计
外层循环确定起点,内层循环扩展终点。每次进入新的起点时,重置哈希表重新统计。如果发现重复字符,立即停止当前起点的遍历。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n = s.(), ret = ;
( i = ; i < n; i++) {
hash[] = {};
( j = i; j < n; j++) {
hash[s[j]]++;
(hash[s[j]] > ) {
ret = (ret, j - i);
;
}
}
ret = (ret, j - i);
}
ret;
}
};


