数据结构 KMP 算法实现
数据结构 KMP 算法实现
KMP 算法关键是要求出next数组下面是求next数组的算法
假设 k =next [i],
1) 若pk = pi, 则 p0… pi-k…pi 中最大相同前后缀长度为next[i+1] = k+1
2)若pk ¹ pi ,置 k=next[k] ,然后转到 第1步.
(设 k = next[k],就是考虑前一个更短的匹配前缀,从那里继续向下检查)
3)若 k 值(来自next)为-1,就得到p0… pi-k…pi中最大相同前后缀的长度为k = 0(即next [i+1] = 0)
对求next数组的改进
if (pk== pi) next[i] = next[k]; else next[i]=k;
这一改进可以避免一些不必要的操作.
下面是一个例子:
1 /*============================================================================*\ 2 * 3 * 数据结构基础练习 4 * 5 * KMP 算法测试 6 * 7 * 2013-05-20 by 樊列龙 8 * 9 \*============================================================================*/ 10 11 #include <iostream> 12 13 using namespace std; 14 15 void set_next(char* p, int* next) 16 { 17 int i = 0, j= -1; 18 next[0] = -1; 19 20 while(p[i]) 21 { 22 while(j >= 0 && p[i] != p[j]) 23 { 24 j = next[j]; 25 } 26 i++,j++; 27 if(p[i] == p[j]) next[i] = next[j]; 28 else next[i] = j; 29 30 } 31 } 32 33 int KMP(char* s, char* p, int *next, int n) 34 { 35 int i = 0,j = 0; 36 int count = 0; 37 while(s[i] && j < n) 38 { 39 if(j == -1 || s[i] == p[j]) 40 { 41 j++,i++; 42 count++; 43 } 44 else 45 { 46 j = next[j]; 47 } 48 } 49 50 if(j >= n) 51 { 52 return i-n+1; 53 } 54 55 return 0; 56 } 57 58 int main() 59 { 60 char s[] = "abaabca8934baaabaabc23abaabcaca2312"; 61 char p[] = "abaabcac";//8个字符 62 int next[100]; 63 64 set_next(p,next); 65 cout << KMP(s,p,next,sizeof(p)-1) << endl; 66 67 return 0; 68 }
结果:
23
转载于:https://www.cnblogs.com/CocoonFan/archive/2013/05/20/3087913.html
数据结构 KMP 算法实现相关推荐
- 数据结构--KMP算法总结
数据结构-KMP KMP算法用于解决两个字符串匹配的问题,但更多的时候用到的是next数组的含义,用到next数组的时候,大多是题目跟前后缀有关的 . 首先介绍KMP算法:(假定next数组已经学会, ...
- [转]数据结构KMP算法配图详解(超详细)
KMP算法配图详解 前言 KMP算法是我们数据结构串中最难也是最重要的算法.难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维.真正理解代码的人可以说对KMP算法的了解已经相当深入了.而 ...
- 数据结构——KMP算法(难懂版,但还是看看吧)
据说这个算法很难,起初看了<大话数据结构>,知道了这个算法,但是没看懂没理解,然后看其他博客,尽管博客上写着易懂,好理解,但我仍然看不懂,不理解,心里一直在口吐芬芳. 后来我看了几个版本的 ...
- 数据结构KMP算法配图详解(超详细)
KMP算法配图详解 前言 KMP算法是我们数据结构串中最难也是最重要的算法.难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维.真正理解代码的人可以说对KMP算法的了解已经相当深入了.而 ...
- 数据结构 KMP算法中next数组与nextval如何求
个人学习用,比较杂乱. 一.例题 二.题目(3)next解法见图 三. nextval如何求解? 3.1步骤一:画图,先求出next 3.2 位置1的数必定为0,记住即可 位置2的next为1,所以要 ...
- a - 数据结构实验之串一:kmp简单应用_中高级面试必备:快速入门数据结构和算法
一 前言 1 为什么要学习算法和数据结构? 解决特定问题. 深度优化程序性能的基础. 学习一种思想:如何把现实问题转化为计算机语言表示. 2 业务开发要掌握到程度? 了解常见数据结构和算法,沟通没有障 ...
- 数据结构与算法之KMP算法
数据结构与算法之KMP算法 目录 KMP算法介绍 输入字符串str1,str2,返回字符串str2是否在str1中,在的话在第几位开始 1. KMP算法介绍 在CSDN上看到一篇写的很好的关于KMP的 ...
- 数据结构与算法一篇帮助你吃下KMP算法
模式匹配 什么是模式匹配,我们用一个案例来说明: 当S = "s1,s2,s3,s4 -sn" T="t1,t2,t3,t4 - tn" 在字符串S中寻找T字符 ...
- c语言数据结构kmp中next计算,数据结构——关于KMP算法中next函数的详细解析
以前看到数据结构中字符串的模式匹配时,花了半天的时间,才把KMP算法中的next函数整明白了,结果过了几天在看到这时,只记得next[j+1]=next[j]+1,但是有时候能套公式正确算出,有时候就 ...
- 数据结构 4 字符匹配-KMP算法
第四章主要介绍的是串,但是串的实现没什么必要,最重要的知识点在于KMP算法的使用,大二时数据结构总结过一次KMP算法,大二时总结的比较细致,链接如下: https://blog.csdn.net/we ...
最新文章
- 数据库实验:数据库和表、查询、视图与安全性、存储过程及游标、触发器、综合实验-水果商店进阶
- Android RxJava 2.0中backpressure(背压)概念的理解
- linux网络编程常用函数详解与实例(socket--bind--listen--accept)
- spring-boot 入门学习
- CentOS 下安装xdebug
- 详解李兰娟团队重大抗疫药物成果:2款处方药,体外试验有奇效,已在浙江临床使用...
- 重读模式与架构(2)——层次划分的依据和角色职责
- 枚举smb共享期间出错_大量三星手机黑屏系统崩溃,客服:闰4月计算出错
- c语言编程GetTickCount,c语言计算时间方法---clock-GetTickCount-QueryPerformanceCounter
- C语言阿拉伯数字转大写汉字,阿拉伯数字转大写汉字
- 目前为止最靠谱的禁用windows10update易升自动更新的办法
- 自定义电子邮件 html_如何在Windows 10中设置和自定义电子邮件帐户
- Apache Zeppelin安装和启动
- 福州大学计算机专业排名2018,福州大学2019年排名第64位 较2018年下降3名
- mac电脑备份后的微信聊天记录怎么找
- ipmitool 配置IP地址,账户,密码
- OpenCL Programming Guide - OpenCL 编程指南 - 书中源代码
- 网络的可靠性是设计出来的
- java抽象方法声明_java抽象类和抽象方法
- SpringBoot——【thymeleaf】——为什么要使用thymeleaf
热门文章
- python怎么更新列表_python更新列表的方法
- 服务器是怎么响应服务器的细节,我怎样才能得到响应从Web服务器
- ant 日期组件中文_Vue3开源组件库,今天“它们”来了
- 【动手学深度学习】代码(持续更新)
- jxl java mer_导出报表出错,有没有大神懂得
- 计算机采用二进制码的优点
- linux 进程 D 状态,Linux 进程的 Uninterruptible sleep(D) 状态
- leetcode 125 valid-palindrome
- CS231n李飞飞计算机视觉 神经网络训练细节part2上
- 【知识图谱系列】动态时序知识图谱EvolveGCN