题目描述
给定主串和模式串,问模式串在主串中出现的次数
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; }
时间: 2024-10-15 12:24:24