标签:
题目描述
给定主串和模式串,问模式串在主串中出现的次数
Sample Input
3
BAPC
BAPC
AZA
AZAZAZA
VERDI
AVERDXIVYERDIAN
Sample Output
1
3
0
解题思路:KMP算法是找到一个匹配就跳出,这题是要计数,所以我们把KMP算法稍微改一下即可,在找到一个匹配(即j=模式串长度)时计数器++,再从next[j]开始找就好了。详见代码
#include <cstdio>
#include <cstring>
void GetNext(char* p,int next[])
{
int pLen = strlen(p);
int k = -1;//k记录的是next[j]
next[0] = k;
int j = 0;
while (j < pLen) {
/** next[j]=-1时,next[j+1]肯定是0;p[j]=p[k]时,next[j+1]=next[j]+1 */
if (k == -1 || p[j] == p[k]) {
++k;
++j;
if(p[j] != p[k]) next[j] = k;
else next[j] = next[k];
}
else k = next[k];
}
}
const int maxn = 1000010;
char s[maxn];
char p[10010];
int next[10010];
int main()
{
int t;
scanf("%d",&t);
while(t--) {
scanf("%s",p);
GetNext(p,next);
int cnt = 0;
scanf("%s",s);
int i=0,j=0;
int len1=strlen(s),len2=strlen(p);
while(i < len1) {
if(j == -1 || s[i] == p[j]) {
++i;
++j;
if(j == len2) { //找到了一个匹配串
cnt++; //计数器++
j = next[j]; //从next[j]继续开始匹配
}
}else j = next[j];
}
printf("%d\n",cnt);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/area_52/article/details/43308911