这一题用的是桶排来判断字符出现的次数
既然涉及到最短区间 那么就要想到用min max函数来将符合题意的答案多次对比得出最优解
我采用的方法是双指针
#include<bits/stdc++.h>
using namespace std;
int t,k;
int main()
{
cin>>t;
while(t--)//多组数据输入
{
string s;
int j=0;//第二指针
int minn=1e5;//基准值
int a[26]={0};//初始化
cin>>s>>k;
int ls = s.length();
for(int i=0;i<ls;i++)//第一指针
{
a[s[i]-'a']++;//桶排计数
while(a[s[i]-'a'] >= k)//若有一个桶超过了k 我们接下来要做的就是 计算他的区间长度
{
minn=min(minn,i-j+1); //+1是因为j会多走一格 自行模拟可得出结论
a[s[j]-'a']--;//并不会影响后面的求解 因为第一次满的桶一定比区间长度已经大于了他后面满的可能性 这里说不清楚 我觉得你可以自行设置数据模拟 自行体会
j++;//指针从0开始前进 直到该桶小于k为止
}
}
if(minn==1e5) printf("-1\n");//没有满桶的情况下
else printf("%d\n",minn);
}
return 0;
}