自己写的测试了几个结果是对的
性能没有好的数据测试
仅供参考,主要靠你自己
/////////////////////////////////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