kmp算法模板及理解

kmp算法是复杂度为O(n+m)的字符串匹配算法;

首先kmp算法的核心是在模式串中获得next数组,这个数组表示模式串的子串的前缀和后缀相同的最长长度;

这样在匹配的过程中如果指到不匹配的位置,模式串用next数组进行跳转到符合的位置,而目标串不需要再往回匹配,为什么是最长的相同的前缀后后缀呢?

因为只有这样才能一边避免可能漏掉的位置,一边尽量不重复已经匹配的位置;

getNext的函数:

void getNext()
{
    int k = -1,j = 0,len = strlen(str);
    next[0] = -1;
    while(j < len)
    {
        if(k == -1||str[j] == str[k])
        {
            j++;
            k++;
            next[j] = k;//相等的话就往后继续;
        }
        else k = next[k];//不等的话就相当于kmp一样,把模式串的这个子串用已经求出来的next跳转;
    }
}

kmp算法代码:

int kmp()
{
    int posP = 0,posT = 0;
    int lenP = strlen(strP),lenT = strlen(strT);
    while(posP < lenP&&posT < lenT)
    {
        if(posP == -1||strP[posP] == strT[posT])
        {
            posP++;
            posT++;

        }
        else posP = next[posP];
        if(posP == lenP)return posT-lenP;//匹配成功返回匹配成功的位置;
    }
    return -1;//匹配失败哦;
}
时间: 2024-11-08 19:18:09

kmp算法模板及理解的相关文章

hdu 1711 KMP算法模板题

题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串长度". 当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度, 而且next[j]恰好等于这个最大长度. 防止超时.注意一些细节.. 另外:尽量少用strlen.变量记录下来使用比較好,用字符数组而不用string //KMP算法模板题 //hdu

KMP算法的个人理解

版权声明:转载请声明出处. 前言 自学了一段时间,刚刚准备转行做软件开发,面试过程中被指出计算机基础知识薄弱.因为是非科班出生,确实有些计算机方面的基础没有学过,也开始恶补这些方面的东西. 最近在学习数据结构与算法过程中,学到KMP算法,甚是难解.看了阮一峰的网络日志后才慢慢理解,但也发现其中的瑕疵,在此也顺带指出,至于对或不对,还请各位看客指正. 图片和例子讲解均引自阮一峰的网络日志,稍作修改,侵改. 正文 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我

KMP算法简明扼要的理解

KMP算法也算是相当经典,但是对于初学者来说确实有点绕,大学时候弄明白过后来几年不看又忘记了,然后再弄明白过了两年又忘记了,好在之前理解到了关键点,看了一遍马上又能理解上来.关于这个算法的详解网上文章可以说遍地开花,可我觉得大多数文章,不需要看内容,光看看详解的文章篇幅就可以吓死人,然后讲来讲去内容也让人云里雾里.我在这里结合自己的理解,简单的解释一下. 在读这篇文章之前,首先请忘记以前了解的关于KMP算法的任何知识点.因为关于有些文章的解释还不一样,可能会让本来就很绕的说法变得更绕,与其说哪样

【2】KMP算法的一些理解问题

该算法在考研时书上看到过,但是因为不作为必考内容所以没有细细复习.这次复习到才感受到它的魅力,并且也花了很久时间才弄懂了基本概念. 关于KMP的细节不再细说,这里只提出学习的方法和对大家可能遇到的问题的理解: 一.KMP之前 当我们需要在字符串S中找到是否存在P时,是怎么解决的?先看看暴力方法是怎么解决的--因为暴力方法最好理解,符合我们的惯性思维,当然时间复杂度就达到了O(m*n),其中m和n分别代表字符串S的长度和模式串P的长度. 二.什么是KMP KMP的名字是该算法的三个创始人名字首字母

[算法之美] KMP算法的直观理解

KMP算法是解决字符串匹配问题的,简单说来,其实就是问"P串(Pattern串)是不是T串(Text串)的子串,如果是的话就回答子串在P中的起始位置(即Index函数的返回值)". 穷举的算法是摆好T串并固定,然后手拿着P串一个一个比对.(我们假设i是指向T串的,j是指向P串的) 现在我们拿着P串,看它的第1个字符和T串的第1个字符是不是相同的,是的话就看它的第2个字符和T串的第2个字符是不是相同的--不是的话就把P串右移一格,然后{ 看P串的第1个和T串的第2个是不是相同的,是的话就

KMP算法模板

不懂的话推荐看这篇博客,讲的很清楚 http://blog.csdn.net/v_july_v/article/details/7041827 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int maxlen=1024; 6 char S[maxlen],T[maxlen],next[maxlen]; 7 void get_next(

KMP算法模板 求子串和模板串首先匹配的位置

1 #include <cstdio> 2 using namespace std; 3 4 const int MAXN = 1e6 + 10; 5 int nex[MAXN]; 6 int s[MAXN], t[MAXN]; 7 8 void get_nex(int lm) { 9 int i = 0, j = -1; nex[0] = -1; 10 while (i < lm) { 11 if (j == -1 || t[j] == t[i]) { 12 i++; j++; nex

Kmp 算法模板 C

/** * name:KMP * time:2012-11-22 * 字符串快速匹配 */ #include<stdio.h> #include<string.h> typedef struct seqstring{ char string[100]; int length; }seqstring; void getnext(seqstring p,int next[]){ int i,j; next[0]=-1;//next[0]放上-1 i=0;//指向字符串每个字符的指针 j

[模板]KMP算法

昨天晚上一直在调KMP(模板传送门),因为先学了hash[关于hash的内容会在随后进行更(gu)新(gu)]于是想从1开始读...结果写出来之后一直死循环,最后我还是改回从0读入字符串了. [预先定义被匹配文本串为s1,长度为m:匹配模式串为s2,长度为n] KMP算法在字符串匹配算法中时间复杂度比较优,可以做到在O(m+n)的时间内匹配,相对于无脑暴力匹配的O(m*n)复杂度而言要优很多. KMP算法的思路比较简单,即在匹配前对字符串进行预处理,用空间换时间,通过处理next数组来实现在部分