KMP子串匹配

分为两个操作:

1.求next数组/longestPrefix数组

2.kmp字符串匹配

模板:

cpp 复制代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;

vector<int> computePrefix(string pat) {
    int m = pat.size();
    vector<int> longestPrefix(m);
    for(int i = 1, k = 0; i < m; i ++ ) {
        while(k > 0 && pat[i] != pat[k]) {
            k = longestPrefix[k - 1];
        }   
        if(pat[i] == pat[k]) {
            longestPrefix[i] = ++k;
        } 
        else {
            longestPrefix[i] = k;
        }    
    }
    return longestPrefix;
}

void kmp(string text, string pat) {
    int n = text.size();
    int m = pat.size();
    vector<int> longestPrefix = computePrefix(pat);
       
    for(int i = 0, k = 0; i < n; i ++ ) {
        while(k > 0 && pat[k] != text[i]) {
            k = longestPrefix[k - 1];
        }
        if(pat[k] == text[i]) {
            k ++;
        }
        if(k == m) {
            cout << i - m + 1 + 1 << endl;
            k = longestPrefix[k - 1];
        }
    }
}
int main() {
    string text, pat;
    cin >> text >> pat;

    kmp(text, pat);

    return 0;
}
相关推荐
长不胖的路人甲1 小时前
什么是赫夫曼树(哈夫曼树 / Huffman Tree)
python·算法·霍夫曼树
Warren2Lynch2 小时前
掌握 UML 构造型、标记定义与标记值:面向领域特定建模的 UML 扩展全面指南
大数据·算法·uml
157092511342 小时前
【无标题】
开发语言·python·算法
稚南城才子,乌衣巷风流2 小时前
换根法(Rerooting)算法详解
算法
晓子文集2 小时前
Tushare接口文档:期货交易日历(fut_trade_cal)
大数据·算法
^yi4 小时前
【Linux系统编程】进程状态的理解
算法·僵尸进程·孤儿进程·进程状态·挂起状态·阻塞状态
hhzz4 小时前
机器学习-算法模型系列文章:04-KNN 不做标准化就跑KNN?你的模型正在被一个特征“独裁“
人工智能·算法·机器学习
冻柠檬飞冰走茶4 小时前
PTA基础编程题目集 7-7 12-24小时制(C语言实现)
c语言·开发语言·数据结构·算法
长不胖的路人甲5 小时前
二叉排序树(BST)Java 完整实现 + 删除思路详解
java·开发语言·算法
geovindu5 小时前
python: Breadth First Search Algorithm and Depth First Search Algorithm
开发语言·后端·python·算法·搜索算法