一步一步复习数据结构和算法基础-KMP算法

来源:互联网 发布:icinga windows 编辑:程序博客网 时间:2024/05/21 22:29

  在csdn里面看了许多关于KMP算法的讲解,我想自己不需要讲了。

我主要看的是这个博主的帖子,写的非常好非常详细啊。

http://blog.csdn.net/v_JULY_v/article/details/7041827

果断的贴代码。

#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXSTRLEN 255typedef unsigned char SString[MAXSTRLEN + 1];int next[MAXSTRLEN];//创建一个串void StrAssign(SString T){int i;char temp[MAXSTRLEN];gets(temp);for(i=1;i<=MAXSTRLEN;i++){T[i] = temp[i-1];}T[0] = strlen(temp);}//KMPint Index_KMP(SString S,SString T,int pos){int i=pos,j=1;while(i<=S[0] && j<=T[0]){if(j==0 || S[i] == T[j]){i++;j++;}elsej = next[j];}if(i > T[0]) return i-T[0];else return 0;}//一般的next数组求解void GetNext(SString T){int i=1,j=0;next[1] = 0;while(i < T[0]){if(j==0 || T[i] == T[j]){++i;++j;next[i]=j;}elsej = next[j];}}//改进版next数组求解void GetNextVal(SString T){int i=1,j=0;next[1] = 0;while(i<T[0]){if(j==0 || T[i] == T[j]){++i;++j;if(T[i] != T[j])next[i]=j;else next[i]=next[j];}elsej=next[j];}}int main(){//a是主串,b是模式串int pos;SString a,b;StrAssign(a);StrAssign(b);GetNext(b);printf("输入匹配的起始位置.\n");scanf("%d",&pos);printf("postion is %d\n",Index_KMP(a,b,pos));return 0;}


原创粉丝点击