题目

计算模板串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));
}