字符串匹配之KMP算法

来源:互联网 发布:帮忙写作业的软件 编辑:程序博客网 时间:2024/05/04 23:14

字符串匹配之KMP算法

KMP算法关键的是要理解怎样获取 next[] 数组


#include "stdafx.h"//获取next数组void get_next(SString T,int next[]){int i,j;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 get_next2(SString T,int next[]){int i,j;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] = next[j];}elsenext[i] = j;}elsej = next[j];}}int IndexKMP(SString S,SString T,int pos){int i,j,next[100];get_next2(T,next);i=pos;j=1;while(i<=S[0] && j<=T[0]){if(j==0 || S[i] == T[j]){i++;j++;}else{j=next[j];}}//whileif(j>T[0])return i-T[0];elsereturn -1;}


主函数如下main.cpp

// 字符串匹配算法.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"int _tmain(int argc, _TCHAR* argv[]){SString S,T;cout<<"请输入主串的字符串:"<<endl;gets(&S[1]);cout<<"请输入子串的字符串:"<<endl;gets(&T[1]);//给主串的S[0]位置赋值,为字符串的长度for(int i = 1;S[i] != NULL;i++){S[0] = (int)i;}//给子串的T[0]位置赋值,为字符串的长度for(int i = 1;T[i] != NULL;i++){T[0] = (int)i;}//cout<<"子串在主串中的位置为:"<<Index3(S,T,0)<<endl;cout<<"子串在主串中的位置为:"<<IndexKMP(S,T,0)<<endl;return 0;}

VS2010下运行结果为:


0 0
原创粉丝点击