题目

思路
- 核心条件:子串(意味着元素必须连续,所以应该用包含连续元素的窗口来处理)
- 方法
- 滑动窗口,因为期望获得更大的子串,窗口右端点尽可能往右延伸,为了不出现重复元素,左端点在出现重复元素的时候,负责向右缩进,缩紧整个窗口
- 怎么判断元素重复:只要能计数就行,map、cnt[]计数数组
代码
int lengthOfLongestSubstring(string s)
{
int n = s.size()
int ans = 0
map<char,int> mp
int i = 0
int j = i
while(j < n)// j: 右端点尽力向右滑动,期望获得更大的窗口
{
char c = s[j]
mp[c] += 1
while(i<n && mp[c] > 1)// i: 左端点收缩,维护元素不重复的合法状态
{
mp[s[i]]--
i++
}
ans = max(ans,j-i+1)
j++
}
return ans
}
总结
- 核心条件是"子串",常用
滑动窗口 来处理(两个指针维护窗口宽度)
- 滑动窗口的本质:右端点尽力去扩宽窗口,左端点收缩,以维护合法性。本题,左端点执行的条件,即 不能出现重复元素,因此要对窗口内部的元素计数
- 元素计数/重复元素判断,用 计数数组
cnt[]、map