题目
计算模板串S在文本串T中出现了多少次?
输入描述
由大小写字母组成的两组字符串,第一行为模板字符串,第二行为文本串,找出模板字符串在文本串出现的次数
输出描述
输出模板字符串在文本串出现的次数
示例
ababd
abababdb
思路
1、暴力法:拿模板字符串和文本串逐个比较,时间复杂度 O(m*n)
2、KMP算法:
参考链接:KMP算法详解
题解
KMP - C语言
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 计算模板串S在文本串T中出现了多少次
* @param S string字符串 模板串
* @param T string字符串 文本串
* @return int整型
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
int next_array(const char *patten, int *next)
{
const int len = strlen(patten);
int i;
int j = -1;
next[0] = j;
for (i=1; i<len; i++) {
while (j>-1 && patten[i] != patten[j+1]) { // 当匹配表中有匹配信息后
j = next[j];
}
if (patten[i] == patten[j+1]) { //ababc // -1,-1,0,1,-1
j++;
}
next[i] = j;
}
return 0;
}
int kmp(char* S, char* T ) {
const int lens = strlen(S);
const int lent = strlen(T);
if (lens == 0 && lent == 0) {
return 0;
}
if (lens == 0) {
return 0;
}
int *next = (int*)malloc(sizeof(int)*lens);
next_array(S, next);
print_array(next, lens);
int i, j=-1, cnt=0;
for (i=0; i<lent; i++) {
while (j>-1 && T[i] != S[j+1]) {
j = next[j];
}
if (T[i] == S[j+1]) {
j++;
}
if (j == lens-1) {
cnt++;
}
}
free(next);
return cnt;
}
int main(void)
{
char S[256];
char T[256];
scanf("%s%s", S, T);
printf("%d\n", kmp(S, T));
}