题目:
解题思路:尺取:要求子串最短,则相同的字母个数必定不能超过k,又因为题目要求至少为k,则相同的字母个数必是k。
满足个数为k,则l++;
不满足,则r++;
直到r遍历到字符串末尾
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
map<char,ll>mp;
int main()
{
ll n,k;
cin>>n>>k;
string s;
cin>>s;
for(ll i=0;i<n;i++)
{
mp[s[i]]++;
}
//cout<<mp[0+'a']<<endl;
ll pr=0,pl=0,ans=inf;
for(ll i=0;i<26;i++)
{
if(mp['a'+i]>=k)
{
ll l=0,r=0,cnt=0;
if(s[r]==char('a'+i)) cnt++;
while(1)
{
if(cnt==k)
{
if(ans>r-l+1)
{
ans=r-l+1;
pr=r;pl=l;
}
if(s[l]==char('a'+i)) cnt--;
l++;
}
else if(cnt<k)
{
if(r==n-1) break;
r++;
if(s[r]==char('a'+i))
{
cnt++;
}
}
}
}
}
if(ans==inf) puts("-1");
else
{
cout<<ans<<endl;
}
}