/*
Name:
Copyright:
Author:
Date: 13/07/11 19:14
Description:
*/
#include <iostream>
#include <string>
using namespace std;
void InitNext(string szPartern,int* iNext)
{
iNext[0] = -1;
int iStrIndex = 0;
int iNextIndex = -1;
int iLength = szPartern.size();
while(iStrIndex < iLength)
{
if(iNextIndex == -1 || szPartern[iStrIndex] == szPartern[iNextIndex])
{
iNextIndex = iNextIndex + 1;
iStrIndex = iStrIndex + 1;
iNext[iStrIndex] = iNextIndex;
}
else
iNextIndex = iNext[iNextIndex];
}
}
int KmpFind(string szTarget,string szPartern,int* iNext)
{
int iTargetLength = szTarget.size();
int iParternLength = szPartern.size();
int iTargetIndex = 0;
int iParternIndex =0;
while(iTargetIndex < iTargetLength && iParternIndex < iParternLength)
{
if(iParternIndex == -1 || szTarget[iTargetIndex] == szPartern[iParternIndex])
{
if(iParternIndex == iParternLength - 1)
{
return iTargetIndex - iParternIndex;
}
iParternIndex = iParternIndex + 1;
iTargetIndex = iTargetIndex + 1;
}
else
iParternIndex = iNext[iParternIndex];
}
return -1;
}
void PrintResualt(int iFindIndex)
{
switch(iFindIndex)
{
case -1:
cout<<"filed to find"<<endl;
break;
default:
cout<<"find index: "<<iFindIndex<<endl;
}
}
int main()
{
int iNext[100];
memset(iNext,0,sizeof(iNext));
string szTarget;
string szPartern ;
cout<<"Target string input"<<endl;
cout<<"Partern string input"<<endl;
while(cin>> szTarget && cin>>szPartern)
{
InitNext(szPartern,iNext);
int iFindIndex = KmpFind(szTarget,szPartern,iNext);
PrintResualt(iFindIndex);
}
getchar();
}