您的位置:首页 > 其它

字符串匹配之KMP算法

2015-05-07 13:09 302 查看
字符串匹配之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;
}
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下运行结果为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: