KMP算法标准模板
来源:互联网 发布:淘宝排名的影响因数 编辑:程序博客网 时间:2024/05/16 07:50
#include <iostream>#include <cstdio>#include <cstring>#define MAXN 10+1000using namespace std;//P[0]不使用,P[i]表示B串的前i个字符中, 前P[i]个字符和后P[i]个字符相同int Next[MAXN];char* KMP(char* A, char* B); //返回B串在A串中的位置 B串:模式串 A串:待匹配串void build_next(char *B); //将B串(模式串)进行自我匹配char a[]="ababababbc";char b[]="ababbc";int main(){ build_next(b); char *idx = KMP(a, b); if(!idx) puts("b is not a's substring."); else printf("b is a's substring, the index is %d\n",idx-a); return 0;}char* KMP(char *A, char *B){ int len1=strlen(A), len2=strlen(B); int i, j=0; //j代表目前B串中已与A串匹配了的字符的个数 for(i=0; i<len1; ++i) { while(j>0 && A[i]!=B[j]) //0...j-1,已匹配了j个字符,sub[j]是sub的第j+1的字符,因为下标从0开始 j = Next[j]; if(A[i] == B[j]) ++j; if(j == len2) //当j(B中已匹配了的字符串的个数)与B串本身长度相等时,说明匹配完毕 return A+i-j+1; //此时可计算出指针位置 } return NULL;}void build_next(char *B){ Next[0] = 0; Next[1] = 0; int i, j=0, len=strlen(B); for(i=2; i<len; ++i) { /*while(j>0 && B[j]!=B[i-1]), 这里的j代表 在比较第i个字符(从1开始数)和B[j]时,前i-1个字符中的前j个字符和后j的字符相同 B[j]代表第j的字符(从1开始数)的下一个字符*/ while(j>0 && B[j]!=B[i-1]) //如果第i个字符和第j个字符的下一个字符(即B[j])不同,则改变j的值,再重新比较 j = Next[j]; if(B[j] == B[i-1]) ++j; Next[i] = j; }}
下面是主要代码部分:
char* KMP(char *A, char *B){ int len1=strlen(A), len2=strlen(B); int i, j=0; //j代表目前B串中已与A串匹配了的字符的个数 for(i=0; i<len1; ++i) { while(j>0 && A[i]!=B[j]) //0...j-1,已匹配了j个字符,sub[j]是sub的第j+1的字符,因为下标从0开始 j = Next[j]; if(A[i] == B[j]) ++j; if(j == len2) //当j(B中已匹配了的字符串的个数)与B串本身长度相等时,说明匹配完毕 return A+i-j+1; //此时可计算出指针位置 } return NULL;}void build_next(char *B){ Next[0] = 0; Next[1] = 0; int i, j=0, len=strlen(B); for(i=2; i<len; ++i) { /*while(j>0 && B[j]!=B[i-1]), 这里的j代表 在比较第i个字符(从1开始数)和B[j]时,前i-1个字符中的前j个字符和后j的字符相同 B[j]代表第j的字符(从1开始数)的下一个字符*/ while(j>0 && B[j]!=B[i-1]) //如果第i个字符和第j个字符的下一个字符(即B[j])不同,则改变j的值,再重新比较 j = Next[j]; if(B[j] == B[i-1]) ++j; Next[i] = j; }}
0 0
- KMP算法标准模板
- 【KMP】KMP算法模板
- kmp算法模板
- kmp算法模板
- KMP算法模板
- KMP算法模板
- KMP算法(模板)
- KMP算法模板
- KMP算法模板
- KMP算法模板
- KMP算法模板
- KMP算法模板
- KMP算法模板
- KMP 算法模板
- kmp算法模板
- kmp算法模板
- KMP算法模板
- KMP算法模板
- 容器如何找到service方法
- wikioi1001舒服的线路(kruskal)
- uva1356 - Bridge 自适应simpson公式
- 拷贝构造函数(转载)
- Matlab permute( )函数 & 矩阵A 和矩阵A' 的差别 & imresize( )函数
- KMP算法标准模板
- 统计之都 http://cos.name/
- Java中日历类取每周每月每季度的第一天和最后一天
- Spring4 MVC Hibernate4集成
- Git入门教程
- cocos2dx移植android
- 使用 /proc 文件系统来访问 Linux 内核的内容
- TortoiseGit使用入门
- shell编程--企业面试题