KMP算法

简介: KMP算法

如果看y总的视频讲解,最好看后面的,因为后面有举字符串的例子


image.png


解题过程

image.png

代码


1.#include <iostream>
using namespace std;
const int N = 100010;
int n, m;
int ne[N];
char s[N], p[N];
int main()
{
    cin >> n >> p + 1 >> m >> s + 1;//数组下标为1,所以是p+1  s+1
    //求ne[]过程
    for (int i = 2, j = 0; i <= n; i ++ )//因为ne[1]=0,使用i下标从2开始
    {
        //反复匹配,所以用while
        while (j && p[i] != p[j + 1]) //如果j!=0(即j没有退回起点)
        {
            j = ne[j];//退而求其次
        }
        if (p[i] == p[j + 1]) j ++ ;//前进一步
        ne[i] = j;
    }
    //kmp匹配过程
    for (int i = 1, j = 0; i <= m; i ++ )
    {
        while (j && s[i] != p[j + 1]) //如果j!=0(即j没有退回起点),并且不匹配
        {                             //就使用ne[]往前退
            j = ne[j];                //如果退无可退(j=0)就看下一个i
        } 
        if (s[i] == p[j + 1]) j ++ ;//如果已经匹配,那么寻找下一个
        if (j == n)
        {
            printf("%d ", i - n);//输出起始位置
            j = ne[j];//因为有左右两部分字符串匹配,所以要退回前面
        }
    }
    return 0;
}
相关文章
|
3月前
|
算法 测试技术 C#
【KMP】【二分查找】【C++算法】100207. 找出数组中的美丽下标 II
【KMP】【二分查找】【C++算法】100207. 找出数组中的美丽下标 II
|
3月前
|
算法 C++ 索引
leetcode-28:实现 strStr()(字符串匹配,暴力匹配算法和KMP算法)
leetcode-28:实现 strStr()(字符串匹配,暴力匹配算法和KMP算法)
32 0
|
2月前
|
机器学习/深度学习 算法 C语言
【编码狂想】深度探索C++编程之旅:“数组、字符串、函数与KMP算法解密“
【编码狂想】深度探索C++编程之旅:“数组、字符串、函数与KMP算法解密“
73 0
|
1月前
|
算法
白话 KMP 算法
白话 KMP 算法
12 2
|
1月前
|
算法 Java 索引
算法基础:KMP算法详细详解
算法基础:KMP算法详细详解
|
2月前
|
算法 测试技术 C++
【KMP】【二分查找】【C++算法】100207. 找出数组中的美丽下标 II
【KMP】【二分查找】【C++算法】100207. 找出数组中的美丽下标 II
|
2月前
|
算法
KMP 算法小结
KMP 算法小结
10 0
|
2月前
|
算法 搜索推荐 程序员
C语言第三十三练—— KMP算法和扩展 KMP算法
C语言第三十三练—— KMP算法和扩展 KMP算法
33 0
|
2月前
|
算法 测试技术 C++
【数据结构】模式匹配之KMP算法与Bug日志—C/C++实现
【数据结构】模式匹配之KMP算法与Bug日志—C/C++实现
35 0
|
3月前
|
算法