用KMP算法写的完整程序,麻烦您了
收起
知与谁同
2018-07-20 09:50:41
1168
0
1
条回答
写回答
取消
提交回答
-
自己写的测试了几个结果是对的
性能没有好的数据测试
仅供参考,主要靠你自己
/////////////////////////////////c++////////////////////////////////////////////////////
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int *next;
string mString;
string nString;
void getNext(string n)
{
next=new int[n.length()];
char nHead=n[0];
for(int j=0;j<n.length();j++)
{
next[j]=0;
for(int i=j-1;i>(j)/2;i--)
{
if(n[i]==nHead)
{
int tHead=i;
int tEnd=j-1;
int count=0;
for(int h=tHead;h<=tEnd;h++)
{
if(n[count++]!=n[h])
break;
}
if((count==tEnd-tHead+1)&&n[count]!=n[j])
next[j]=count;
}
}
}
}
int main()
{
cout<<"input main String please!"<<endl;
cin>>mString;
cout<<"input sub String please!"<<endl;
cin>>nString;
getNext(nString);
int pos;//第一个匹配模式的首字母的实际位置
for(int i=0,j=0;i<=mString.length()&&j<=nString.length();)
{
if(j==nString.length())
{
pos=i-j+1;
cout<<"successed and start postion is "<<pos<<endl;
delete[]next;
return 0;
}
if(mString[i]!=nString[j])
{
if(j==0)
i++;
else
j=next[j];
}
else
{
i++;
j++;
}
}
cout<<"failed!"<<endl;
delete[]next;
return 0;
}
2019-07-17 22:55:56