题意:给定由小写字母组成的字符串和k,求字符串的子串个数,子串满足每个字母数目不超过n。
这是一种O(n)算法。
<span style="font-size:14px;">#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
char str[100005];
int f[26],k;
int main()
{
int t;
cin>>t;
while(t--)
{
memset(f,0,sizeof(f));
scanf("%s%d",str,&k);
int st=0;
long long int ans=0;
for(int i=0;str[i]!='\0';i++)
{
int s=str[i]-'a';
f[s]++;
if(f[s]>k) {
while(str[st]!=str[i])
{
f[str[st]-'a']--;
st++;
}
f[str[st]-'a']--;
st++;
}
ans+=(i-st+1);//右边界每+1表示多了i-st+1条以该点为结尾的子串
}
printf("%I64d\n",ans);
}
return 0;
}
</span>