• 分别使用暴力算法、KMP算法求解
  • 在main()函数实现调用

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
 //1、经典暴力算法 
int BF(string text, string pattern) {
    int sum = 0;
    for (int pos = 0; pos < text.length() - pattern.length() + 1; pos++) {
        int flag = 1;
        // 从 pos 开始,检查是否与 pattern 匹配
        for (int i = 0; i < pattern.length(); i++) {
            if (text[pos + i] != pattern[i]) {
                flag = 0;
                break;
            }
        }
        if (flag) sum++;
    }
    return sum;
}
// 2、KMP数组
int* getNext(string pattern) { // 使用 DP 求解 next 数组
    int* next = new int[pattern.length()];
    next[0] = -1;
    int i = 0, j =
                -1; // i为当前主串正在匹配的位置,也是 next 数组的索引
    while (i < pattern.length()) {
        if (j == -1 || pattern[i] == pattern[j]) next[++i] = ++j;
        else j = next[j];
    }
    return next;
}
int KMP(string text, string pattern) {
    int* next = getNext(pattern);
    int sum = 0, j = -1; // 初始化 j 为-1
    for (int i = 0; i < text.length(); i++) { //匹配text[i]
        while (j != -1 && text[i] != pattern[j + 1]) { //j+1?
            j = next[j]; // 回退,更新模式串指针
        }
        if (text[i] == pattern[j + 1]) { // 匹配成功,令j加1
            j++;
        }
        if (j == pattern.length() - 1) { // 完全匹配,说明找到了一个子串
            sum++;
            j = next[j]; // j 回退,继续匹配
        }
    }
    delete[] next; // 释放内存空间
    return sum;
}

int main() {
    string text, pattern;
    while (cin >> text >> pattern) {
        int sum;
        sum=BF(text, pattern);
        // sum=KMP(text,pattern);
        cout << sum << endl;
    }
    return 0;
}