字符串查找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=;k<m;k++){
        j = ;
        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[] = ;
    for(q=,k=;q<strlen(p);q++){
        //若果不相等,那么就从上一次个字符串最长前缀处查看,依次类推
        while(k>&&p[q]!=p[k]){
            k = next[k-];
        }
        if(p[q]==p[k]){
            k++;
        }
        next[q] = k;
    }
}
void kmp(char t[],char p[]){
    int next[] = {};
    makeNext(p,next);
    int i=,j=;//i是匹配串的下标,j是模式串的下标
    while(i<strlen(t)&&j<strlen(p)){
        //如果相等就继续比较
        if(j==||p[j]==t[i]){
            i++;
            j++;
        }else{//不相等就要跳跃
            j = next[j-];
        }
    }
    if(j>=strlen(p)){
        printf("模式串匹配在%d处\n",i-j);
    }else{
        printf("匹配失败了");
    }
}
字符串查找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 字 ... 
随机推荐
- android Activity Application Context 的区别
			用了这么久的Context,对于Context究竟是个什么玩意一直不是很明白.看了网上十几篇文章的介绍 加上自己的理解总结一下.(自己想法,不对勿喷,不想照搬网上一些文字说法来糊弄自己,自己理解的就这 ... 
- 网络编程应用:基于TCP协议【实现对象传输】--练习
			要求: 基于TCP协议实现,客服端向服务器发送一个对象 服务器接受并显示用户信息 ,同时返回给客户端 "数据已收到" 建一个Student类,属性:name age Student ... 
- 可视化之AQICN
			上一篇和大家分享了<可视化之Berkeley Earth>,这次看一看下面这个网站---aqicn.org.先做一个提示:文末有惊喜~ 该网站在中国有一定的权威性,PM2.5数据有一点敏感 ... 
- 文件快速删除工具, 解决你的node_modules
			摘要: 还在为删除文件慢烦恼吗?强大工具dlf来帮助你.作为一名前端开发,最常见的就是node_modules,如果dependencies很多,osx系统删除还好,Windows用户就麻烦了.本文分 ... 
- 原生JS+Canvas实现五子棋游戏
			一.功能模块 先看下现在做完的效果: 线上体验:https://wj704.github.io/five_game.html 主要功能模块为: 1.人机对战功能 2.悔棋功能 3.撤销悔棋功能 二.代 ... 
- Linux sort -g 的困惑
			sort命令是帮我们依据不同的数据类型进行排序,排序的效率很高,因此也是很常用的命令. sort参考及说明:https://www.gnu.org/software/coreutils/manual/ ... 
- ViewPager实现无限轮播踩坑记
			最近笔者想通过ViewPager来实现一个广告Banner,并实现无限轮播的效果,但是在这个过程中踩了不少的坑,听我慢慢道来.如果大家有遇到和我一样的情况,可以参考我的解决方法,没有那就更好,如果针对 ... 
- 一个比较完善的httpWebRequest 封装,适合网络爬取及暴力破解
			大家在模拟http请求的时候,对保持长连接及cookies,http头部信息等了解的不是那么深入.在各种网络请求过程中,发送N种问题. 可能问题如下: 1)登录成功后session保持 2)保证所有c ... 
- flask笔记二
			web表单 web表单是浏览者和网之间的一个互动平台,完成浏览器和服务器之间的数据交互. 1.用Flask-WTF来处理表单 (1)在根目录下编辑扩展配置--config.py CSRF_ENABLE ... 
- Java学习笔记--脚本语言支持API
			Java语言的动态性之脚本语言支持API 随着Java平台的流行,很多的脚本语言(scripting language)都可以运行在Java虚拟机啊上,其中比较流行的有JavaScript.JRuby ... 
