KMP的简单实现
来源:互联网 发布:怎么克服懒惰 知乎 编辑:程序博客网 时间:2024/06/06 00:57
kmp算法是一种效率非常高的字符串匹配算法。
给定两个字符串str和ptr,长度分别为n和m,判断str是否在ptr中出现,如果出现则返回出现的位置。
kmp算法实现方式
我先举个例子:
str:abcabcabe
ptr:abcabe
首先将abcabe转化为next数组000120
这是怎么转化的呢,
第一位表示a 它的最长 的 相同的前缀和后缀的长度为 0
第二位表示ab 它的最长 的 相同的前缀和后缀的长度为 0
第三位表示abc 它的最长的 相同的前缀和后缀的长度为 0
第四位表示abca 它的最长的相同的前缀和后缀的长度为1(前缀a 后缀a)
第五位表示 abcab 它的最长的相同的前缀和后缀的长度为2(前缀 ab 后缀ab)
第六位表示abcabe 它的最长的相同的前缀和后缀的长度为0
注意:前缀表示第一位到倒二位。
将ptr转化为next数组后,我就开始比较。
str[0]==ptr[0],
接着str[1]==ptr[1]继续比较直到str[5]!=ptr[5],这时将str[5]和ptr[next[5-1]]进行比较。为什么这样呢?
str:abcabcabe
ptr:abcabe
000120
当c不等于e时,e前表示已经匹配成功,next[5-1]表示e前的元素 相同的前缀和后缀 的 最长长度为2.
选择str匹配不成功的c和ptr[next[5-1]]即(ptr[2])进行匹配。
str:abcabcabe
ptr: abcabe
匹配成功。
附上代码:
#include<stdio.h>#include<string>#define M 1000#define N 100 int * getNext(char *str ,int len){ int next[M]; int j=1; next[0] = 0; for(int i = 1;i<len;i++) { j = next[i-1]; if(str[j] == str[i]) { next[i]=next[i-1]+1; }else{ next[i] = 0; } } return next;}int KMP(char str[],int sLen,char ptr[],int pLen){ int j = 0; int *next; next=getNext(ptr,pLen); for(int i =0 ;i<sLen;i++){ if(str[i] == ptr[j]) { j++; }else{ j=next[j-1]; } if(j==pLen) { return i-j+1; } } return -1;}void main(){ char str[M]; char ptr[N]; gets(str); gets(ptr); printf("%d",KMP(str,strlen(str),ptr,strlen(ptr)));}
阅读全文
1 0
- KMP的简单实现
- KMP算法简单实现
- KMP简单的代码
- kmp的简单理解
- 简单的KMP算法
- kmp的简单应用
- KMP的简单应用
- 简单的KMP算法
- KMP算法 C#简单实现
- python kmp算法简单实现
- KMP算法的简单总结以及java代码实现
- KMP算法的实现
- KMP算法的实现
- KMP算法的实现
- KMP算法的实现
- KMP实现的strstr
- KMP算法的实现
- kmp算法的实现
- 自定义Android Studio方法注释模板
- 'keytool' 不是内部或外部命令,也不是可运行的程序
- OkHttp之BridgeInterceptor简单分析
- XML中的DTD约束
- 2017it技术人员都该参加这些会议
- KMP的简单实现
- **ANDROID**# 第七章图形与图像处理(静态处理) > Bitmap是有像素点构成的点阵图。 ------ ## 使用简单的图片 ---- * 通过Drawable对象进行访问。
- Flume和Logstash的那些事儿
- 成为Java顶尖程序员 ,看这11本书就够了
- Java 容器知识点(简)
- 深入探究connect函数
- jsp隐式对象
- TCP/IP协议,HTTP协议--面试必备
- 下载CentOS的Linux内核的源代码