KMP算法中的模式串移动数组
来源:互联网 发布:淘宝美工一般怎么抠图 编辑:程序博客网 时间:2024/06/05 18:10
题目描述
字符串的子串定位称为模式匹配,模式匹配可以有多种方法。简单的算法可以使用两重嵌套循环,时间复杂度为母串与子串长度的乘积。而KMP算法相对来说在时间复杂度上要好得多,为母串与子串长度的和。但其算符比较难以理解。
在KMP算法中,使用到了一个next数组。这个数组就是在比较失配时母串指针不必回溯,而子串指针移动相应位置即可。我们给出书中next数组的算式表示以及算法,请你实现之。
图1:next数组的算式表示
图2:next数组的算法表示
输入
一个模式串,仅由英文小写字母组成。长度不大于100。
输出
输出模式串对应的移动数组next。每个整数后跟一个空格。
样例输入
abaabcac
样例输出
0 1 1 2 2 3 1 2
提示
收起提示[-]
提示: 数据结构与以前相同,只用字符数组即可,只要调用上述函数即可。 总结: KMP算法在字符串模式匹配算法中比较高效,具体KMP算法将在以后介绍。 参考代码: http://www.csbiji.com/thread-39884-1-1.html
#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXSTRLEN 100typedef struct{ char *ch;}HString;void InitString(HString *T);void StrAssign(HString *T,char charb[]);void Get_next(HString *T,int next[]);void print(HString *T,int next[]);void InitString(HString *T){ T->ch='\0'; return ;}void StrAssign(HString *T,char charb[]){ int i,len; if(T->ch) free(T->ch); len=strlen(charb); if(!charb) { T->ch='\0'; } else { T->ch=(char *)malloc((len+1)*sizeof(char)); if(!T->ch) { printf("ÄÚ´æ·ÖÅäʧ°Ü\n"); exit(-1); } else { for(i=0;i<len;i++) { T->ch[i+1]=charb[i]; } T->ch[0]=len; } } return ;}void Get_next(HString *T,int next[]){ int i=1; next[1]=0; int j=0; while(i<T->ch[0]) { if(j==0||T->ch[i]==T->ch[j]) { ++i; ++j; next[i]=j; } else j=next[j]; } return ;}void print(HString *T,int next[]){ int i; for(i=1;i<=T->ch[0];i++) { printf("%d ",next[i]); } return ;}int main(){ int Next[MAXSTRLEN]; char chara[MAXSTRLEN]; scanf("%s",chara); HString S; InitString(&S); StrAssign(&S,chara); Get_next(&S,Next); print(&S,Next); return 0;}
阅读全文
0 0
- KMP算法中的模式串移动数组
- KMP算法中的next[]数组
- KMP算法中的next数组
- KMP算法中的next数组
- 模式匹配中的kmp算法
- KMP算法中的next数组求解
- KMP算法中的NEXT数组的应用
- KMP算法中的Next数组的求取
- KMP算法中的next数组解析
- KMP 模式串匹配算法
- 串-KMP模式匹配算法
- KMP算法中的next数组的两种算法求解
- KMP模式匹配算法中next[]数组求法
- 数据结构之模式匹配KMP算法的next数组求解
- KMP模式匹配算法之next数组解析
- KMP 算法 next数组
- KMP算法--next数组
- KMP算法+NEXT数组
- golang日記
- Android面试题-键盘弹起挡住输入框
- Deep Learning 最优化方法之AdaGrad
- Unity3D-优化之一 Drawcall
- 牛客网编程小结(五)——vector
- KMP算法中的模式串移动数组
- 第一天的博客
- 静态库和动态库
- openresty+SSL安装
- Spring 注释 @Autowired 和@Resource 的区别
- VTK基本数据结构之数据的存储和表达
- IT小白对File文件类的使用的理解
- 【C++】二叉树遍历--递归与非递归实现
- 转载:学习资源