这是一道模板题。
给定一个字符串 A 和一个字符串 B,求 B 在 A 中的出现次数。A 和 B 中的字符均为英语大写字母或小写字母。
A 中不同位置出现的 B 可重叠。
输入格式输入共两行,分别是字符串 A 和字符串 B。
输出格式输出一个整数,表示 B 在 A 中的出现次数。
样例| input | output |
| zyzyzyz zyz | 3 |
1 ≤A,B 的长度 ≤1e6,A、B 仅包含大小写字母。
#include思路启发:#include char a[1000010],b[1000010]; int prefix[1000010]; void get_prefix(); void kmp(); int main() { scanf("%s",a); scanf("%s",b); kmp(); return 0; } void get_prefix(){ prefix[0] = -1; prefix[1] = 0; int i = 1,len = 0,m = strlen(b); while(i < m ) { if(b[i] == b[len]){ len++; i++; prefix[i] = len; } else{ if(len > 0) { len = prefix[len]; } else{ prefix[++i] = len; } } } } void kmp(){ get_prefix(); int n = strlen(a),m = strlen(b); int i=0,j=0,sum=0; while(i < n) { if(j == m-1 && a[i] == b[j]){ sum++; j = prefix[j]; } if(a[i] == b[j]){ i++; j++; } else{ j = prefix[j]; if(j == -1){ i++; j++; } } } printf("%d",sum); }
KMP字符串匹配算法2_哔哩哔哩_bilibili
KMP算法之求next数组代码讲解_哔哩哔哩_bilibili



