【算法】KMP字符串匹配算法

【原理】

(1)next数组原理

(2)特殊情况的处理(巧妙增设哨兵)

(3)递推法构造next[]表

【实现代码】

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int maxn = 100;
char t[maxn];   //text
char p[maxn];
int next[maxn];

void getNext(){
     int m = strlen(p);
     int j=0;     //"主串指针"
     next[0] = -1;
     int t = -1; //模式串指针
     while(j<m-1){
         if(t<0 || p[j]==p[t]){
            next[++j] = ++t;
        }
        else{
            t=next[t];
        }
     }
} 

int KMP(){
    getNext();    //构造next表
    int n = strlen(t), i=0;//文本串长度
    int m = strlen(p), j=0; //模式串长度
    while(j<m && i<n){
        if(j<0 || t[i]==p[j]){    //若匹配,一起前进
            i++;
            j++;
        }
        else{        //否则,p右移,t不退回
            j=next[j];
        }
    }
    return i-j;
}

int main(){
    cin >> t; // abcdefgabkdabcdu
    cin >> p; // abkdab
    cout << KMP();
    return 0;
}

【参考资料】

邓俊辉教授数据结构

原文地址:https://www.cnblogs.com/chsobin/p/8996058.html

时间: 2024-07-31 16:21:14

【算法】KMP字符串匹配算法的相关文章

KMP字符串匹配算法及next前缀数组的应用

#KMP字符串匹配算法及next前缀数组的应用------ KMP算法通常是我们学习字符串匹配算法时遇见的第一个算法,另外还有Rabin-Karp, Sunday算法等. 相对于其他字符串匹配算法, kmp在字符串中字符重复率低的情况下并不具备优势,那为什么KMP算法会作为经典的教学算法呢? 原因可能是:KMP算法充分利用next前缀数组的信息来优化算法,减小时间复杂度的思路在很多字符串相关问题中能给我们启发. 首先上KMP字符串匹配算法, [leetcode在线测试地址](https://le

KMP字符串匹配算法——用最容易理解的方式描述

看了数据结构书上对于快速模式匹配算法KMP的介绍,感觉云里雾里.本文根据自己理解,并查资料整理了一种非常清晰简单的字符串匹配算法,并给予实现,自诩原创吧. 字符串匹配是我们经常要用到的一种算法,与普通的匹配算法相比KMP算法效率更高,时间复杂度为O(m+n).下面给予详细讲解: 概念详解 设原字符串为"BBC ABCDAB ABCDABCDABDE",待匹配字符串为"ABCDABD". 首先,字符串"BBC ABCDAB ABCDABCDABDE"

KMP字符串匹配算法翔解?

那么首先我们知道,kmp算法是一种字符串匹配算法,那么我们来看一个例子. 比方说,现在我有两段像这样子的字符串: 分别是T和P,很明显,P比T的长度要短很多,我们要做的事情呢,就是找找T中有没有和P相同的一段. 如果按照最简单的办法来做匹配的话,我们一般是一个一个字母的来做. 像这样: 很显然,图中前面3位都是能匹配的,而第四位却不能匹配,怎么办? 这样: 我们就会将整个P字符串向右移动一格,又重新开始,从T中b处与P中第一个a处开始匹配. 如此往复,显然这样是很慢的,因为我们来考虑考虑这样一种

[小明学算法]6.字符串匹配算法---KMP

1.简介  字符串匹配就是看看那字符串b是不是字符串a的子串.常用的Knuth-Morris-Pratt 算法,又称KMP算法. 2.主要思想 当patter在某一位置与string匹配失败时,我们除了知道从string的这个位置进行匹配失败这个结果外,是否可以从前面的匹配中获得更多的信息呢.即当前匹配点匹配失败之后,向右滑动的距离是可以提前计算出来的. 3.举例 abcabcabcdef   --------- string abcabcdef         --------- patter

算法学习——KMP字符串匹配算法

KMP算法是一种非常高效和常用的算法.其核心就是通过预处理一个寻找公共最大前后缀的 Next[ ] 数组,减少匹配失败时的重复无效匹配. next数组本质:next[ i ] = j 表示下标以 i - j 为起点,i为终点的后缀和下标以0为起点,j为终点的前缀相等. 复制一些别人的图片用来帮助理解next是什么. 然后是kmp算法的思想原理: 下图是主串为:ababaeaba 字串为:ababacd 的一个例子: 例题: 代码: #include<iostream> using namesp

KMP字符串匹配算法详解

KMP算法利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息.时间复杂度O(m+n). Next()函数的详解 把将要进行next计算的字符串S分成 k ,j 前后两串,k代表前串开头所在的序号,j代表后串开头所在的序号,起始的时候j=1,k=0. 我们比较一下前串 后串是否相等,要怎么比较呢,肯定是比较S[j]==S[k],如果相等,那么next[j+1]=k+1,然后j++,k++.关键就是理解这

KMP字符串匹配算法

1 #include<iostream> 2 #include<string> 3 #include<vector> 4 using namespace std; 5 bool matched(string s,int k,int i) 6 { 7 bool result=true; 8 int p=0; 9 int q=i; 10 while(p<k) 11 { 12 if(s[p]==s[q]) 13 { 14 p++;q--; 15 } 16 else 17

28. Implement strStr()(KMP字符串匹配算法)

Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. Example 1: Input: haystack = "hello", needle = "ll" Output: 2 Example 2: Input: haystack = "aaaaa",

字符串匹配算法

字符串匹配问题的形式定义: 文本(Text)是一个长度为 n 的数组 T[1..n]: 模式(Pattern)是一个长度为 m 且 m≤n 的数组 P[1..m]: T 和 P 中的元素都属于有限的字母表 Σ 表: 如果 0≤s≤n-m,并且 T[s+1..s+m] = P[1..m],即对 1≤j≤m,有 T[s+j] = P[j],则说模式 P 在文本 T 中出现且位移为 s,且称 s 是一个有效位移(Valid Shift). 比如上图中,目标是找出所有在文本 T=abcabaabcaba