字符串查找KMP算法(转)
如果你用过ctrl+F这个快捷键,那么你有很大的概率使用过这个算法,这就是在待查找字符串(可能有成千上万个字符)中找出模式串(比较小,可能有几个字符),可能找到大于或者等于1次的位置。例如,在ababcd中找出abc。这里介绍算法思想,只给出了第一次出现的位置。
一.算法思想
传统算法是从匹配串第一字符开始和模式串比较,直到遇到不符合的字符,然后从匹配串的下一个字符开始,重复上面的过程。代码如下:

void find(char t[],char p[]){
int m = strlen(t);
int n = strlen(p);
int i,j,k;//k:匹配串下标,j:模式串下标
for(k=0;k<m;k++){
j = 0;
i = k;
while(j<n){
if(p[j]==t[i]){
i++;
j++;
}else{
break;
}
}
if(j==n){
printf("在%d处匹配\n",k);
break;
}
}
}

KMP算法是这中算法的改进,在于不是i不是每次都移动一个位置,而是尽可能多的向后移动从而提高匹配效率。到底移动多少个位置,这就是KMP算法的关键。KMP算法维护了一个和模式串长度相同的数组,这个数组表示当前匹配到底最大前缀长度。比如abacab的最大前缀长度就是2,分别是前缀ab,后缀ab。而数组next就是[0,0,1,0,1,2],可以利用这个信息直接跳过已经匹配到的前缀。
二.算法实现

void makeNext(char p[],int next[]){
int q,k;//k是最大前缀长度,q是匹配串下标
next[0] = 0;
for(q=1,k=0;q<strlen(p);q++){
//若果不相等,那么就从上一次个字符串最长前缀处查看,依次类推
while(k>0&&p[q]!=p[k]){
k = next[k-1];
}
if(p[q]==p[k]){
k++;
}
next[q] = k;
}
}
void kmp(char t[],char p[]){
int next[3] = {0};
makeNext(p,next);
int i=0,j=0;//i是匹配串的下标,j是模式串的下标
while(i<strlen(t)&&j<strlen(p)){
//如果相等就继续比较
if(j==0||p[j]==t[i]){
i++;
j++;
}else{//不相等就要跳跃
j = next[j-1];
}
}
if(j>=strlen(p)){
printf("模式串匹配在%d处\n",i-j);
}else{
printf("匹配失败了");
}
}
http://www.cnblogs.com/bdbk/p/5202482.html
字符串查找KMP算法(转)的更多相关文章
- c算法:字符串查找-KMP算法
/* *用KMP算法实现字符串匹配搜索方法 *该程序实现的功能是搜索本目录下的所有文件的内容是否与给定的 *字符串匹配,如果匹配,则输出文件名:包含该字符串的行 *待搜索的目标串搜索指针移动位数 = ...
- 字符串查找KMP算法
如果你用过ctrl+F这个快捷键,那么你有很大的概率使用过这个算法,这就是在待查找字符串(可能有成千上万个字符)中找出模式串(比较小,可能有几个字符),可能找到大于或者等于1次的位置.例如,在abab ...
- 查找字符串的 KMP 算法
查找字符串是我们平常编程过程中经常遇到的,现在介绍一种查找字符串算法,增加程序的执行速度. 通常我们是这么写的: /* content: search a string in a othor stri ...
- 字符串模式匹配KMP算法
一篇不错的博客:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html KMP字符串模式匹配通俗点说就是一种在一个字符串中 ...
- 字符串类——KMP算法的应用
1,字符串类中的新功能(本文代码已集成到字符串类——字符串类的创建(上)中,这里讲述函数实现原理): 2,子串查找(KMP 算法直接运用): 1,int indexOf(const char* s) ...
- [Algorithm] 字符串匹配算法——KMP算法
1 字符串匹配 字符串匹配是计算机的基本任务之一. 字符串匹配是什么?举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串& ...
- 字符串匹配算法——KMP算法
处理字符串的过程中,难免会遇到字符匹配的问题.常用的字符匹配方法 1. 朴素模式匹配算法(Brute-Force算法) 求子串位置的定位函数Index( S, T, pos). 模式匹配:子串的定位操 ...
- 字符串匹配算法——KMP算法学习
KMP算法是用来解决字符串的匹配问题的,即在字符串S中寻找字符串P.形式定义:假设存在长度为n的字符数组S[0...n-1],长度为m的字符数组P[0...m-1],是否存在i,使得SiSi+1... ...
- 字符串匹配算法-kmp算法
一原理: 部分转自:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 字 ...
随机推荐
- Java调用IIS发布的WebService
之前的一篇博客说了一个实例,就是用VS2005在IIS上发布WebService.今天我们来实现在Eclipse上用Java来调用昨天发布的WebService. 首先咋在浏览器中输入http://1 ...
- poj1155(树形dp)
题目链接:http://poj.org/problem?id=1155 题意:电视台要直播一场比赛,电视网络刚好形成了一棵树,其中有M个为客户端,其他的为中转站,其中中转站与中转站以及中转站与客户端之 ...
- windows之实现3D立体效果的三种方法
第一种:快捷键:win+tab 另外一种:cmd输入rundll32.exe dwmapi #105 第三种:使用软件bumptop
- 询问任意区间的min,max,gcd,lcm,sum,xor,or,and
给我们n个数,然后有m个询问,每个询问为L,R,询问区间[L,R]的最大最小值,最小公约数,最大公约数,和,异或,或,且 这些问题通通可以用RMQ的思想来解决. 以下用xor来作为例子 设dp[i][ ...
- [Unity3D]Unity4全新的动画系统Mecanim
Unity4.X添加一个新的动画系统,以取代原有的3.X旧的动画系统,全新的动画系统Mecanim是官方推荐,它使我们能够写更少的代码实现连续动画. 效果图 Unity3.X中动画系统播放动画 使用播 ...
- [HTML5游戏开发]简单的《找没有同汉字版〗爆去考考您狄综力吧
[color=ize:18px]一,筹办工做 本次 游戏开发需求用到lufylegend.js开源游戏引擎,版本我用的是1.5.2(如今最新的版本是1.6.0). 引擎下载的位置:http: ...
- 第三章 AOP 编程选择
Spring为我们开发者提供了多种AOP的编程方式.我们该如何选择呢? 如果项目采用的是JDK5.0以上版本,我们可以选择@AspectJ的方式.这是第一选择. http://blog.csdn.ne ...
- WPF DataGrid_SelectChanged获取单元内容
private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { ...
- Oracle SQL Lesson (4) - 使用转换函数和条件表达式
隐式转换select * from emp where empno='7788'字符(char,varchar2)转换为数字(number)或日期(date)数字或日期转换为字符 显式转换字符转换为数 ...
- HDU4960Another OCD Patient(间隙dp,后座DP)
Another OCD Patient Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Ot ...