我(菜鸡)的想法是先从起始点开始扫描然后直到有字母达到k个 达不到就输出-1
用数组储存字符个数 用ans记录最短长度
然后维护这一子串 从起始点开始删减字符 直到不满足 从终止点添加字符直到满足
如此重复
这样把字符串走完 最短长度就出来了
蒟蒻的代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n,k;
ll q[1000];
string a;
ll ff()
{
for(int i='a';i<='z';++i)
if(q[i]==k) return 1;
return 0;
}
int main()
{
cin>>n>>k>>a;
ll len=0;
ll lenmin=1e10;
ll kk=1;
ll l,r=0;
for(int i=0;i<n;++i)
{
q[a[i]]++;
len++;
if(ff()){l=i;break;}
}
if(!ff()){cout<<-1<<endl;return 0;}
lenmin=len;
while(l<n)
{
if(ff())
{
lenmin=min(len,lenmin);
q[a[r]]--;
r++;
len--;
}
else
{
l++;
q[a[l]]++;
len++;
}
}
cout<<lenmin<<endl;
return 0;
}
京公网安备 11010502036488号