字符串匹配之KMP算法
2015-05-07 13:09
302 查看
字符串匹配之KMP算法
KMP算法关键的是要理解怎样获取 next[] 数组
主函数如下main.cpp
VS2010下运行结果为:
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; } else j = 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]; } else next[i] = j; } else j = 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]; } }//while if(j>T[0]) return i-T[0]; else return -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下运行结果为: