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;
}
相关文章
|
6月前
|
算法
数据结构中的KMP算法及其改进算法
KMP算法通过引入部分匹配表,有效避免了重复计算,从而将字符串匹配的时间复杂度降低到O(m+n)。通过进一步优化next数组,KMP算法的效率得到了进一步提升。对于大规模字符串匹配问题,KMP算法及其改进算法提供了高效的解决方案,是计算机科学领域的经典算法之一。
92 3
|
2月前
|
算法
第四章 KMP算法理论基础
第四章 KMP算法理论基础
20 0
|
2月前
|
算法
KMP算法
KMP算法
35 0
|
4月前
|
算法 C++
A : DS串应用–KMP算法
这篇文章提供了KMP算法的C++实现,包括计算模式串的next数组和在主串中查找模式串位置的函数,用于演示KMP算法的基本应用。
|
5月前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
130 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
4月前
|
算法
KMP算法
KMP算法
31 0
|
5月前
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用
|
6月前
|
人工智能 算法 BI
一篇文章讲明白KMP算法(俗称看毛片算法)
一篇文章讲明白KMP算法(俗称看毛片算法)
60 0
|
6月前
|
算法 Java
Java数据结构与算法:字符串匹配算法之KMP算法
Java数据结构与算法:字符串匹配算法之KMP算法
|
7月前
|
算法