题目考点:尺取法(双指针)
题目大意:给定一个字符串,问集齐26个字母所需要的最短区间是多长。
题目分析:右指针字符串,当26个字母集齐之后移动左边界,维护最短长度即可;
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 26, M = 1000010;
int n, ans = M, ch[N];
string s1;
bool jud() //判断26个字符是否集齐
{
for(int i = 0; i < 26; i++)
if(!ch[i]) return false;
return true;
}
int main()
{
cin>>s1;
int len = s1.length();
for(int l = 0, r = 0; r < len; r++)
{
ch[s1[r] - 'a'] ++ ;
while(jud()) //如果集齐26个字母,维护最小值,移动左边界
{
ch[s1[l] - 'a']--;
ans = min(ans, r - l + 1);
l++;
}
}
cout<<ans;
return 0;
}
京公网安备 11010502036488号