题意:
给你一个串s,让你去计算一下有多少符合串中相同字母的个数不大于k值的子串的数目
思路:
尺取法; 设两个指针h,t,让t 向右移动,确保现在的子串满足题目要求,不满足的话,把h向右移动,直到满足为止,当t到串的尾部停止;
CODE
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define LL __int64
int a[30];
char s[110000];
int main()
{
int k,t,len,i,pos,x;
LL sum;
scanf("%d",&t);
while(t--)
{
sum = 0;
scanf("%s",s);
scanf("%d",&k);
memset(a,0,sizeof(a));
len = strlen(s);
pos = 0;
for(i = 0; i < len;i++)
{
x=s[i]-'a';
a[x]++;
if(a[x]>k)///如果当前的字母数已经大于k了,就让左边的指针右移,更新该串的字母的次数
{
while(s[pos]!=s[i])
{
a[s[pos]-'a']--;///不是子串中的字母要把对应的次数减去1
pos++;
}
a[s[pos]-'a']--;///前移一位,让对应字母数小于等于k;
pos++;
}
sum+=i-pos+1;///增加子串数目
}
printf("%I64d\n",sum);
}
return 0;
}