// kmp.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "stdio.h"
#include<iostream>
#include<string>
using namespace std;
//int * myComputePrefix(string);
int * myComputePrefix( string& P)
{
int m=P.size();
int *PI=new int[20];
PI[1]=0; //NOT USE 1
int k=0;
int q,ii;
for(ii=0;ii<20;ii++) PI[ii]=-1;//init by 66
for(q=2;q<m;q++)//66 from second to last
{
//这个while每次要么不执行,PI[q]=-1;要么执行一次。
while(k>=0 && P[k+1]!= P[q])
k=PI[k];
if (P[k+1] == P[q]) //hence here ,use P[]
k=k+1; //这句有两句的含义。品味
PI[q]=k; //是不是要不是 成功找到的上面那种,或者-1;
//for debug
printf("ovevlay %d : %d \n",q,PI[q]);
}
return PI;
}
void myKmpMatch(string &T,string & P)
{
int n=T.size();
int m=P.size();
int *PI=new int[20];
PI=myComputePrefix(P);
//debug check;
int i;
for ( i=0;i<m;i++) //BUG ..P.size > PI....
printf("check ovevlay %d : %d \n",i,PI[i]);
int q=-1; //Number of characters matched. 66 we set -1
// for(int i;;i++)... ; for(int i=0;;)没有受影响?
for(i=0; i<n;i++)
{
//第一个字幕比较,就不经过这里就是。而且全部都不经过?//66
//q >0 在 第一个字母 不等起作用啦。
while(q>0 && P[q+1] != T[i])
{
q=PI[q]; //why?
}
//想像一下,-1+1也会从这里过啊。
if ( P[q+1] == T[i])
q=q+1; //相当于 两个游标 动
if (q ==m -1) //66
{
printf("index %d patch ok \n", i);
q=PI[q];
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
string T="bababa";//
//string P="abaabc";
//string P="ababababca";
//string P="aabaa";
string P="aba";
//dw :char *x=[];只能一次赋值? String 是 只有一次?
//printf("Target : %s ,Pattern %s \n",T,P);
myKmpMatch(T,P);
printf("game ok\n");
getchar();
return 0;
}