题目:


解题思路:尺取:要求子串最短,则相同的字母个数必定不能超过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;
}
}
本文介绍了一种使用尺取法解决特定字符串问题的算法。尺取法通过动态调整左右指针来寻找满足条件的最短子串,特别适用于处理包含特定数量重复字符的字符串问题。文章提供了详细的解题思路和AC代码实现。
382

被折叠的 条评论
为什么被折叠?



