- 浏览: 63057 次
- 性别:
- 来自: 北京
最新评论
#include <stdlib.h> #include <string.h> int bf(char* text, char* patten){ int i = 0; int j = 0; while(i<strlen(text) && j<strlen(patten)){ if(text[i] == patten[j]){ i++; j++; }else{ //i回溯到 开始匹配的下一个位置 i = i-j+1; //j回溯到最开始0处 j = 0; } } //匹配到时候是j<strlen(patten)条件不满足的时候 return j>strlen(patten)-1 ? i-j : -1; } //在J位置发生不匹配以后,找到一个k使 P[0~K]==P[K+1~J]调整将J调整为K //这个方法也可以将next(j-1)求解出的子问题存储起来,这么写主要是为了好想 int next(char* patten, int j){ if(j==0||j==-1){ return 0; } if(patten[j]==patten[next(patten, j-1)+1]){ return next(patten, j-1)+1; }else{ while(1){ int k = next(patten, j-1); if(patten[j]==patten[k+1]){ return next(patten, k); } } } } int kmp(char* text, char* patten){ int i = 0; int j = 0; while(i<strlen(text) && j<strlen(patten)){ if(text[i] == patten[j] || j==0){ i++; j++; }else{ //j位置发生不匹配 //j通过分析模式串,计算出模式串下一个比较位置和文本不匹配位置匹配 j = next(patten, j-1); } } return j>strlen(patten)-1 ? i-j : -1; } int main(){ char* text = "adjfskjfskdjsfkglsi"; char* patten = "skdj"; printf("%d\n",bf(text, patten)); printf("%d\n",kmp(text, patten)); return 0; }
发表评论
-
求链表中间节点的值,检测链表的环
2012-07-27 14:19 852求链表中间节点的值,检测链表的环 int loop(st ... -
实习前记
2012-07-16 15:27 757经过回来一周的找工作,总体感觉就是很累啊,每天东跑西颠的。面了 ... -
php函数参数列表
2012-05-11 16:50 1429[size=medium] 1.直接传值 function ... -
php的ob_flush和flush
2012-05-10 21:20 1107php.ini中 output_buffering = of ... -
php读文件的4中方法。
2012-05-10 20:38 906fopen $fp = fopen("downl ... -
百度笔试算法题一道。
2012-05-10 15:02 985一个数组a[0-n-1],a[0-mid]和a[mid+1-n ... -
自己实现php UTF8中文字符串截取
2012-05-09 11:38 2881header("Content-type: te ... -
C与C++动态分配,释放内存的区别
2012-05-08 17:30 160611. malloc()函数 1.1 malloc的 ... -
nginx rewrite
2012-05-04 11:23 0http://blog.cafeneko.info/2010/ ... -
php magic method
2012-05-04 11:16 896php的魔术方法总结 php的魔术方法都是和类有关的。 ... -
诡异的 shell 08 bug
2012-04-30 01:11 771v=08 echo $v shell里以0开头的都会把它当作8 ... -
排序相关
2012-04-22 16:01 0排序分类 内排序: 交换式排序: ... -
php string
2012-04-22 11:33 970一.字符串类型 php一共有8中数据类型 ... -
简单的树的递归、非递归创建,前序中序后序遍历
2012-04-21 10:03 1070c语言写着还挺带感 #in ... -
php 深度优先递归输出路径下所有文件
2012-04-19 21:27 1524<?php $dir = " ... -
简单的栈
2012-04-19 21:14 705#include <stdio.h> #de ... -
简单的循环队列
2012-04-19 21:13 805#include <stdlib.h> ... -
单链表删除一个节点
2012-04-19 21:10 9853有头结点的情况,附加一个逆置 #include <s ... -
ip过滤问题
2012-03-22 21:09 0假设有很多段ip段属于教育网的,如何尽快辨别一用户ip是否属于 ... -
求三叉树高度
2012-03-18 17:05 3146有12345个结点的满3叉数的高度为_____写出计算过程 ...
相关推荐
当主串中的一个字符与模式串中的字符不匹配时,KMP算法会根据之前已经匹配的部分来决定模式串的下一个比较位置,而不是简单地回退到主串的下一个字符。 1. **KMP算法的产生**: 传统的暴力匹配算法在遇到不匹配时...
kmp算法 字符串匹配算法理解(从BF算法到KMP算法) 暴风(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将...具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。
在这个实现中,`KMPIndex`函数利用了预计算的`next`数组来避免不必要的回溯,提高了搜索效率。 ##### 任务二:实现串的替换功能 ```c int Replace(String S, int start, String T, String V) { int pos = BFIndex...
### KMP(字符串匹配)算法总结 #### 第一部分:KMP...以上实现中,`buildNext`函数用于构建`next`数组,而`KMP`函数实现了KMP算法的核心逻辑。通过这种方式,KMP算法能够在最坏情况下以线性时间完成字符串匹配任务。
它主要用于在一个主串中查找一个模式串的位置,相比传统的模式匹配算法(如BF算法),KMP算法的最大优点在于它不会发生回溯,从而避免了重复计算,提高了匹配效率。 #### 核心概念与原理 在深入解析这段C语言代码...
在计算机科学领域,算法的设计与实现是极为重要的一个环节。KMP算法(Knuth-Morris-Pratt算法)作为字符串匹配算法中的经典之一,被广泛应用于文本处理、搜索引擎等领域。此次分享的是使用易语言实现的KMP算法模块...
在这个实现中,`compute_next`函数用于生成Next数组,`KMP`函数则按照KMP算法进行匹配。KMP算法的时间复杂度是O(n + m),大大优于BF算法。 总之,KMP算法在字符串模式匹配中扮演着重要角色,尤其在处理大文本时,其...
从给定的代码片段来看,这是一段C语言程序,主要实现了三种字符串匹配算法:Boyer-Moore(BM)算法、Brute Force(BF)算法以及KMP算法。这段代码不仅展示了这些算法的实现,还通过实际输入的字符串进行了性能测试...
KMP算法通过预处理模式串来实现这一点,预处理的结果通常存储在名为next数组的结构中,这个数组记录了模式串中每个位置之前子串的最长相同前后缀的长度。 在KMP算法中,字符串的模式匹配过程是这样的:用模式串...
KMP算法的核心在于一个预处理过程,通过分析模式串W的特性,构建一个部分匹配表(也称为失败函数或next数组),用来在不匹配时决定W的下一个匹配位置,从而避免从文本的每个位置进行从头到尾的比较,提高了匹配效率...
KMP算法的核心在于如何高效地处理模式串(即需要匹配的字符串),通过构建一个next数组来记录模式串的部分匹配信息,当主串与模式串部分匹配失败时,可以根据这个数组快速定位下一个应该比较的位置,避免重复比较。...
通过预先计算失配函数,KMP算法能够在失配时快速定位到下一个可能的匹配起点,从而实现线性时间复杂度的字符串匹配。这种算法不仅理论价值高,而且在实际应用中也非常广泛,尤其是在文本检索、数据压缩等领域发挥着...
KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。 一.简单匹配算法 先来看一个简单匹配算法的函数: ...
KMP 算法的核心在于构建一个**部分匹配表**(有时也称为失配函数或 next 数组)。该表用于记录模式串中的每一个前缀与后缀的最大公共长度,即最长匹配前缀长度。部分匹配表的构建过程是 KMP 算法最核心也是最复杂的...
(7)函数void MoveK1(HLink &H, int k),将单链表中倒数第k个结点移到第一个结点位置,注意:严禁采用先计算链表长度n再减k(即n-k)的方法; (8)函数void ReverseN2(HLink &H),将单链表的正中间位置结点之后的全部...
BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较...
代码使用C++编写,定义了一个串类,并实现了BF匹配和KMP匹配的函数。在主函数中,使用do-while循环显示菜单,根据用户输入的选项执行相应的操作。注意,这里使用了动态内存分配来存储Next数组,以适应不同长度的...
2. **KMP(Knuth-Morris-Pratt)算法**:KMP算法通过预处理子串T,构建部分匹配表next数组,当匹配失败时,可以直接跳到next数组指定的位置,无需从主串的下一个字符开始比较,这样可以减少比较次数。 #### 程序...
程序清单中使用了C语言实现这些函数,定义了一个SqString结构体来存储串,其中包含一个字符数组data和一个表示串长度的整型变量length。通过引用型参数(即指针)来修改传入的串,提高了代码的效率和灵活性。 总的...