数据结构例程——串的模式匹配(KMP算法)
2015-10-07 15:50
369 查看
本文针对数据结构基础系列网络课程(4):串中第5课时串的模式匹配(KMP算法)。
问题:串的模式匹配
KMP算法:
修正后的KMP算法
问题:串的模式匹配
KMP算法:
#include <stdio.h> #include "sqString.h" void GetNext(SqString t,int next[]) /*由模式串t求出next值*/ { int j,k; j=0; k=-1; next[0]=-1; while (j<t.length-1) { if (k==-1 || t.data[j]==t.data[k]) /*k为-1或比较的字符相等时*/ { j++; k++; next[j]=k; } else k=next[k]; } } int KMPIndex(SqString s,SqString t) /*KMP算法*/ { int next[MaxSize],i=0,j=0; GetNext(t,next); while (i<s.length && j<t.length) { if (j==-1 || s.data[i]==t.data[j]) { i++; j++; /*i,j各增1*/ } else j=next[j]; /*i不变,j后退*/ } if (j>=t.length) return(i-t.length); /*返回匹配模式串的首字符下标*/ else return(-1); /*返回不匹配标志*/ } int main() { SqString s,t; StrAssign(s,"ababcabcacbab"); StrAssign(t,"abcac"); printf("s:"); DispStr(s); printf("t:"); DispStr(t); printf("位置:%d\n",KMPIndex(s,t)); return 0; }
修正后的KMP算法
#include <stdio.h> #include "sqString.h" void GetNextval(SqString t,int nextval[]) //由模式串t求出nextval值 { int j=0,k=-1; nextval[0]=-1; while (j<t.length) { if (k==-1 || t.data[j]==t.data[k]) { j++; k++; if (t.data[j]!=t.data[k]) nextval[j]=k; else nextval[j]=nextval[k]; } else k=nextval[k]; } } int KMPIndex1(SqString s,SqString t) //修正的KMP算法 { int nextval[MaxSize],i=0,j=0; GetNextval(t,nextval); while (i<s.length && j<t.length) { if (j==-1 || s.data[i]==t.data[j]) { i++; j++; } else j=nextval[j]; } if (j>=t.length) return(i-t.length); else return(-1); } int main() { SqString s,t; StrAssign(s,"ababcabcacbab"); StrAssign(t,"abcac"); printf("s:"); DispStr(s); printf("t:"); DispStr(t); printf("位置:%d\n",KMPIndex1(s,t)); return 0; }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#数据结构揭秘一
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 数据结构之Treap详解
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总