KMP字符串匹配

KMP字符串匹配

 

设文本为字符串T,长度为n;模板为字符串P,长度为m;并有n>=m。

KMP算法的复杂度为O(m+n),O(m)为模板预处理时间,O(n)为查找匹配所用时间。

 

传统的暴力匹配未能利用已匹配部分的信息,效率低下。

KMP的核心在于构造状态转换图,可用失配函数表示。

对比见下图。

 

时间: 2024-09-19 09:19:34

KMP字符串匹配的相关文章

字符串匹配的KMP算法

字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一.它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth. 这种算法不太容易理解,网上有很多解释,但读起来都很费劲.直到读到Jake Boxer的文章,我才真正理解这种算法.下面,我用自己的语言

[算法系列之二十六]字符串匹配之KMP算法

一 简介 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的. 二 基于部分匹配表的KMP算法 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含搜索串"ABCDABD"? 步骤1:字符串"BBC ABC

字符串匹配与KMP算法实现

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

字符串匹配的KMP算法(转)

字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一.它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth. 这种算法不太容易理解,网上有很多解释,但读起来都很费劲.直到读到Jake Boxer的文章,我才真正理解这种算法.下面,我用自己的语言

php中字符串匹配KMP算法实现例子

kmp算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特--莫里斯--普拉特操作(简称KMP算法).KMP算法的关键是根据给定的模式串W1,m,定义一个next函数.next函数包含了模式串本身局部匹配的信息 例子  代码如下 复制代码 <?php /* 字符串匹配KMP算法的PHP语言实现 */ function KMP($str) {     $K = array(0);     $M = 0;     $strLen

C语言实现字符串匹配KMP算法_C 语言

字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 下面的的KMP算法的解释步骤 1. 首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的第一个字符,进行比较.因为B与A不匹配,所以搜索词后移一位. 2. 因为B与A不匹配,搜索词再往后移. 3. 就这样,直到字符

使用C语言解决字符串匹配问题的方法_C 语言

最常想到的方法是使用KMP字符串匹配算法: #include <stdio.h> #include <stdlib.h> #include <string.h> int get_nextval(char *pattern, int next[]) { //get the next value of the pattern int i = 0, j = -1; next[0] = -1; int patlen = strlen(pattern); while ( i &l

数据结构实验之串二:字符串匹配

数据结构实验之串二:字符串匹配 Time Limit: 1000MS Memory Limit: 65536KB Problem Description   给定两个字符串string1和string2,判断string2是否为string1的子串.   Input  输入包含多组数据,每组测试数据包含两行,第一行代表string1,第二行代表string2,string1和string2中保证不出现空格.(string1和string2大小不超过100字符)   Output  对于每组输入数

c-文件中字符串匹配问题

问题描述 文件中字符串匹配问题 判断文件中是否存在某一字符串,若存在则退出,若不存在则添加???求用c编写的代码,,,各位大虾帮帮忙,万分感谢!!!!! 解决方案 先读出文件的内容,然后通过 strstr 等类似的功能函数完成字符串是否存在的判断 解决方案二: 参考一下这个 C语言程序,在文件中查找指定字符串出现的次数http://wenda.haosou.com/q/1382138287067435