字符串查找KMP算法(转)
如果你用过ctrl+F这个快捷键,那么你有很大的概率使用过这个算法,这就是在待查找字符串(可能有成千上万个字符)中找出模式串(比较小,可能有几个字符),可能找到大于或者等于1次的位置。例如,在ababcd中找出abc。这里介绍算法思想,只给出了第一次出现的位置。
一.算法思想
传统算法是从匹配串第一字符开始和模式串比较,直到遇到不符合的字符,然后从匹配串的下一个字符开始,重复上面的过程。代码如下:
![](https://common.cnblogs.com/images/copycode.gif)
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;
}
}
}
![](https://common.cnblogs.com/images/copycode.gif)
KMP算法是这中算法的改进,在于不是i不是每次都移动一个位置,而是尽可能多的向后移动从而提高匹配效率。到底移动多少个位置,这就是KMP算法的关键。KMP算法维护了一个和模式串长度相同的数组,这个数组表示当前匹配到底最大前缀长度。比如abacab的最大前缀长度就是2,分别是前缀ab,后缀ab。而数组next就是[0,0,1,0,1,2],可以利用这个信息直接跳过已经匹配到的前缀。
二.算法实现
![](https://common.cnblogs.com/images/copycode.gif)
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 字 ...
随机推荐
- SE 2014年4月29日
交换网络中有vlan1 到20个vlan,要求使用MSTP技术实现vlan的负载分担. SW2为实例1(vlan1-vlan10)的主根,SW3为备根 SW3为实例2(vlan11-vlan20)的主 ...
- SE 2014年4月3日
一 OSPF协议都支持哪些特殊区域?每种特殊区域都有什么特点. OSPF协议支持的特殊区域主要有stub区域.totally stub区域以及nssa区域,其中stub区域一般出现在末梢网络,即它的 ...
- Flash Android ANE打包之基本流程
搭建环境这里就不详细说明了 一.Android本地库编写 1.从Flash Air SDK中提取需要的jar包 Android下需要的jar包在Flash Air SDK/lib/android目录下 ...
- Web监听器导图详解(转)
阅读目录 Web监听器 监听器的分类 Servlet版本与Tomcat版本 getAttribute与getParameter的区别 参考 监听器是JAVA Web开发中很重要的内容,其中涉及到的知识 ...
- ubuntu下安装java和eclipse
java安装 1 下载jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 2 ...
- c语言移位操作
应该先看看C语言是指所有的位二进制算术位计算.即使输入的是十进制的数,在存储器存储为二进制形式. “<<”使用方法: 的格式是:a<<m,a和m式,要求m>=0. 功能: ...
- Openfire开发配置,Openfire源码配置,OpenFire二次开发配置
1.下载源码:http://www.igniterealtime.org/downloads/source.jsp 2.把源码解压出的openfire_src目录放至eclipse workplace ...
- dij算法为什么不能处理负权,以及dij算法变种
对于上面那张图,是可以用dij算法求解出正确答案,但那只是巧合而已. 我们再看看下面这张图. dist[4] 是不会被正确计算的. 因为dij算法认为从队列出来的点,(假设为u)肯定是已经求出最短路的 ...
- MySQL 存储过程和函数(转)
概述 一提到存储过程可能就会引出另一个话题就是存储过程的优缺点,这里也不做讨论,一般别人问我我就这样回答你觉得它好你就用它.因为mysql中存储过程和函数的语法非常接近所以就放在一起,主要区别就是函数 ...
- java中处理字符编码(网页与数据库)(转)
首先声明一下,此文章时从网上转载的.如下的某些方法是确实管用,但是从中发现了有一点不足,就是原文笔者没考虑使用不同Web Server时出现的情况,比如文章里我用红色字体画出来的部分代码在Tomcat ...