KMP算法的一次理解(六)

在前面对KMP算法做了各种的讲解之后,现在要对这个算法做一个代码的实现了:

int KmpSearch(char *s, char *p)
{
    int i = 0;
    int j = 0;
    int sLen = strlen(s);
    int pLen = strlen(p);

    while(i < sLen && j < pLen)
    {
        //如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++
        if(j == -1 || s[i] == p[j])
        {
            i++;
            j++;
        }
        else
        {
            //如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]
            //next[j]即为j所对应的next值
            j = next[j];
        }
    }//while

    if(j == pLen)
    {
        return i - j;
    }
    else
    {
        return -1;
    }
}

KMP算法时间复杂度分析:

如果文本串的长度为n,模式串的长度为m,那么匹配过程的时间复杂度为O(n),算上计算next的O(m)时间,KMP的整体时间复杂度为O(m + n)。

时间: 2024-08-24 07:07:05

KMP算法的一次理解(六)的相关文章

KMP算法详解 --- 彻头彻尾理解KMP算法

[经典算法]——KMP,深入讲解next数组的求解 前言 之前对kmp算法虽然了解它的原理,即求出P0···Pi的最大相同前后缀长度k:但是问题在于如何求出这个最大前后缀长度呢?我觉得网上很多帖子都说的不是很清楚,总感觉没有把那层纸戳破,后来翻看算法导论,32章 字符串匹配虽然讲到了对前后缀计算的正确性,但是大量的推理证明不大好理解,没有与程序结合起来讲.今天我在这里讲一讲我的一些理解,希望大家多多指教,如果有不清楚的或错误的请给我留言. 1.kmp算法的原理: 本部分内容转自:http://w

KMP算法的一次理解

1. 引言 在一个大的字符串中对一个小的子串进行定位称为字符串的模式匹配,这应该算是字符串中最重要的一个操作之一了.KMP本身不复杂,但网上绝大部分的文章把它讲混乱了.下面,咱们从暴力匹配算法讲起,随后阐述KMP的流程步骤.next 数组的简单求解.递推原理.代码求解,接着基于next 数组匹配,谈到有限状态自动机,next 数组的优化,KMP的时间复杂度分析,最后简要介绍两个KMP的扩展算法. 2. 暴力匹配算法 2.1 问题描述: 有一个文本串s和一个模式串p,现在要查找p在s中的位置,怎么

学习记录---KMP算法-部分匹配表理解

如需转载,请保留本文链接. 看了 阮一峰 大神的字符串匹配的KMP算法后,关于部分匹配的部分并不是很理解,特意去看了阮大神文章中的英文链接,这里写下自己的理解,用作学习记录. 阮大神文章链接:https://kb.cnblogs.com/page/176818/ Jake Boxer 英文博文链接:http://jakeboxer.com/blog/2009/12/13/the-knuth-morris-pratt-algorithm-in-my-own-words/ 关于前缀和后缀的定义,这里

KMP算法的一次理解(中)

在开始KMP算法之前,先来回顾一下字符串模式匹配的暴力法,具体的过程如下图所示: 注:图中两个串的匹配都是从1开始的,代码中的匹配都是从0开始的. 可以看到匹配主串的i的值是不断的回溯的,然而KMP三位大师发现这种回溯其实是不需要的,所以提出来这个算法来解决这个问题. 既然i值不能回溯了,也就是不能变小了,那么要考虑变化的就是j值了.为了能说清楚KMP算法,先以暴力算法为基础分析两个例子. 例1: 主串s="abcdefgab"模式串p="abcdex",也就是上面

KMP算法的一次理解(三)

前面说到了字符串的模式匹配的暴力方法,同时在暴力方法的基础上做了一些改进:不让主串的匹配指针i回溯,通过发掘模式串的一些特性,不断的修改模式串的匹配指针.但是模式串的匹配指针怎么修改呢,那就得要结合其自身的一些特性,然后产生相应的修改值,记录在next[j]这个数组中. 1. 寻找前缀后缀最长公共元素长度: 对于,寻找模式串P中长度最大且相等的前缀和后缀.如果存在 = ,那么在包含pj的模式串中有最大长度为k+1的相同前缀后缀.举个例子,如果给定的模式串为“abab”,那么它的各个子串的前缀后缀

KMP算法的一次理解(上)

在一个大的字符串中对一个小的子串进行定位成为字符串的模式匹配,这应该算是字符串中最重要的一个操作之一了. 问题描述: 有一个文本串s和一个模式串p,现在要查找p在s中的位置,怎么查找? 如果用暴力匹配的思路,并假设文本串匹配到i位置,模式串匹配到j位置. 算法描述: 有关字符串的模式匹配,首先来看最简单的一个算法,那就是暴力法.具体的算法描述: (1)初始化i指向主串的初始位置,这里假设是主串的0位置:j指向子串的0位置. (2)若当前字符匹配成功,也就是s[i] == p[j],则i++,j+

字符串匹配与KMP算法笔记

>>字符串匹配问题 字符串匹配问题即在匹配串中寻找模式串是否出现, 首先想到的是使用暴力破解,也就是Brute Force(BF或蛮力搜索) 算法,将匹配串和模式串左对齐,然后从左向右一个一个进行比较, 如果不成功则模式串向右移动一个单位,直到匹配成功或者到达匹配串最后仍然不成功,返回失败. 很明显,这种算法有很多的地方可以优化,假设要搜索的串为S,长度为n,要匹配的串为M,长度为m,时间复杂度为O(nm). >>KMP算法 Knuth-Morris-Pratt算法以三个发明者命名

浅谈KMP算法及其next[]数组

KMP算法是众多优秀的模式串匹配算法中较早诞生的一个,也是相对最为人所知的一个. 算法实现简单,运行效率高,时间复杂度为O(n+m)(n和m分别为目标串和模式串的长度),比蛮力算法的O(nm)快了许多. 理解KMP算法,关键是理解其中的精髓——next[]数组. (统一起见,下文将目标字符串记作obj,将模式字符串记作pattern,这与后面的程序代码是一致的) 我们给一个字符串S定义一个next值,记作next(S),next(S)=n表示: (1)S的前n个字符构成的前缀,和后n个字符的后缀

“浅析kmp算法”

"浅析kmp算法" By 钟桓 9月 16 2014 更新日期:9月 16 2014 文章目录 1. 暴力匹配: 2. 真前缀和真后缀,部分匹配值 3. 如何使用部分匹配值呢? 4. 寻找部分匹配值 5. 拓展 5.1. 最小覆盖字串 6. 参考资料 首先,KMP是一个字符串匹配算法,什么是字符串匹配呢?简单地说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道这个字符串里面是否有"ABCDABD":我想,你的脑海中马上就