https://ac.nowcoder.com/acm/problem/18386
双指针滑窗的基本题型了
模板:
while(r<n){ window.push(); dosomething; while(window 不满足条件){ l++;window.pop(); dosomething; } r++; }
记录26个字母的数量,窗口内等于26个字母就更新答案并且移动左指针(收缩窗口)
#include <bits/stdc++.h> using namespace std; int main() { string s; cin>>s; int n = s.size(); int l=0,r=0; int cnt=0; // 记录在窗口内的字母数量 int ma[26]={0}; // 记录26个字母的数量 int ans=n+1; while(r<n){ if(ma[s[r]-'a']==0){ cnt++; } ma[s[r]-'a']++; if(cnt==26) ans=min(ans,r-l+1);//cout<<r; while(cnt>=26){ char cur = s[l]-'a'; ma[cur]--; l++; if(ma[cur]==0) cnt--; else if(ma[cur]>0) ans=min(ans,r-l+1); } r++; } cout<<ans; return 0; }