KMP算法
来源:互联网 发布:linux man f 编辑:程序博客网 时间:2024/04/29 16:33
1.作用
用于字符串匹配,是一种改进的方法
2.原理
KMP算法的关键是根据给定的模式串Pattern,定义一个next数组。next数组包含了模式串本身局部匹配的信息,即保存中间子字符串从字符串开头匹配的最长公共前缀信息。
3.操作过程
假设在模式匹配的进程中,执行S[i]和P[j]的匹配检查。若S[i]=P[j],则继续检查S[i+1]和P[j+1]是否匹配。若S[i]<>P[j],则分成两种情况:若j=1,则模式串右移一位,检查S[i+1]和P[1]是否匹配;若1<j<=m,则模式串右移j-next(j)位,即执行j=next[j]操作,检查S[i]和P[next(j)]是否匹配。重复此过程直到j=m或i=n结束。
4.代码实现
- //Preprocessing algorithm(计算前缀的函数)
- void kmpPreprocess()
- {
- int i=0, j=-1;//-1表示没有找到
- b[i]=j;
- while (i<m)//小于m是因为循环内先++,后赋值
- {
- while (j>=0 && p[i]!=p[j]) j=b[j];//j能取0是因为要从第0个字符比较
- i++; j++;
- b[i]=j;
- }
- }
- //Searching algorithm(字符串匹配模式搜索函数)
- void kmpSearch()
- {
- int i=0, j=0;
- while (i<n)
- {
- while (j>=0 && t[i]!=p[j]) j=b[j];//当j为-1时表示找不到
- i++; j++;
- if (j==m)
- {
- report(i-j);
- j=b[j];
- }
- }
- }
//Preprocessing algorithm(计算前缀的函数)void kmpPreprocess(){ int i=0, j=-1;//-1表示没有找到 b[i]=j; while (i<m)//小于m是因为循环内先++,后赋值 { while (j>=0 && p[i]!=p[j]) j=b[j];//j能取0是因为要从第0个字符比较 i++; j++; b[i]=j; }} //Searching algorithm(字符串匹配模式搜索函数)void kmpSearch(){ int i=0, j=0; while (i<n) { while (j>=0 && t[i]!=p[j]) j=b[j];//当j为-1时表示找不到 i++; j++; if (j==m) { report(i-j); j=b[j]; } }}
- KMP算法详解 【KMP】
- 【KMP】KMP算法模板
- KMP hihoCoder1015 KMP算法
- kmp算法
- KMP算法
- KMP算法
- KMP算法
- KMP算法
- KMP 算法
- kmp算法
- KMP算法
- kmp算法
- KMP算法
- KMP算法
- kmp算法
- kmp算法
- KMP算法
- KMP算法
- DirectShow 学习笔记< 一> -- 第一个程序
- 10款实用+好用的html5开发工具分享
- ios tableView那些事(三)给tableView添加些图片
- GruntJs之FTP上传文件
- 云计算平台管理的三大利器Nagios、Ganglia和Splunk
- KMP算法
- ubuntu 12.04下MRPT安装
- VCProtect虚拟机加壳工具
- softirq,tasklet和workqueue的分析
- ios开发者必不可少的75个工具
- 《HTTP权威指南》读书笔记---cookie
- Redis的配置与启动
- Go语言下与MongoDB通信-使用mgo
- [LeetCode] Construct Binary Tree from Inorder and Postorder Traversal