您的位置:首页 > 其它

字符串匹配 KMP算法

2016-03-30 22:57 405 查看
/*
description:
字符串匹配 KMP算法

<<编程之法>>   P134

author: JasonZhou
date:  2016-03-29
*/
#include<iostream>
#include <string>
using namespace std;

void calculate_next(string p,int next[])
{
int len=p.length();
int  k= -1,j=0;
next[0]=-1;
while(j < (len-1))
{
if(k == -1 || p[j] == p[k])
{
++k;
++j;
next[j]=k;
}
else
{
k = next[k];
}
}
}

int   KmpSearch(string s1,string s2,int next[])
{
int i=0;
int j=0;
int len1=s1.length();
int len2=s2.length();

while (i<len1 && j<len2)
{
if (j== -1 ||  s1[i]==s2[j])
{
i++;
j++;
}
else
{
j=next[j];
}

}

if (j==len2)
{
return i-j;
}
else
{
return -1;
}

}
int  main()
{
//原字符串
string s1="jadfasjfabcdabdabcjdafjakf";
//要匹配的字符串
string s2="abcdabdabc";
int next[10]={0};
calculate_next(s2,next);
cout<<"----next array----"<<endl;
for (int i=0;i<10;i++)
{
cout<<next[i]<<" ";
}
cout<<endl;
int point=KmpSearch(s1,s2,next);
cout<<"---search---"<<endl;

cout<<s1<<endl;
for (int j=0;j<point;j++)
{
cout<<" ";
}
cout<<s2<<endl;
cout<<"在原字符串匹配成功的位置:";
cout<<point<<endl;

return 0;
}


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