借鉴了 nenu_xlp 的思想;
先把‘a’到‘a’+m-1的字符找到,在将其中的序号最大的减去最小的,在不断更新每个字母对应的序号,重复之前的步骤比较的出最小的结果。。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
using namespace std;
int t[27];
char s[1005];
int q[27];
int b,c;
int show(int w)
{
int s=0;
for(int i=1;i<=w;i++)
{
if(q[i]==0)
return 1;
}
return 0;
}
int main()
{
int a,e,f,w,y;
scanf("%d",&a);
while(a--)
{
int len1=1005;
memset(t,0,sizeof(t));
memset(q,-1,sizeof(q));
scanf("%d %d",&b,&c);
int w=1,ans;
scanf("%s",s);
if(c>26||c<=0||b<c)
{printf("I am so fat!\n");continue;}
for(int i=0;i<b;i++)
{
int min1=1005,max1=-1;
int p=0;
e=s[i]-'a'+1;
q[e]=i;
for(int j=1;j<=c;j++)
{
if(q[j]!=-1)
p++;
}
if(p!=c)
continue;
else
{
for(int j=1;j<=c;j++)
{
if(min1>q[j])
min1=q[j];
if(max1<q[j])
max1=q[j];
}
}
ans=max1-min1+1;
if(len1>ans)
len1=ans;
}
if(len1==1005)
printf("I am so fat!\n");
else
printf("%d\n",len1);
}
return 0;
}