kmp算法

来源:互联网 发布:mac os 安装 websphere 编辑:程序博客网 时间:2024/04/27 17:53

void GetFailure(const char* pat,int failure[])
{
 failure[0] = -1;

 int len = strlen(pat);
 int j;
 for (int i = 1; i < len ; i++)
 {
  j = failure[i-1];//表示pat[j]...pat[0] == pat[i-1]...[pati-j-1];

  while (pat[i] != pat[j+1]&&j>=0)
  {
   j = failure[j];
  }
  if (pat[i] == pat[j+1])
  {
   failure[i] = j+1;
  }
  else
  {
   failure[i] = -1;
  }
 }
}

int Kmp(const char* s,const char* pat)
{

 
 int sl = strlen(s);
 int pl = strlen(pat);
 int*failure = new int[pl];
 GetFailure(pat,failure);

 int i,j;
 for ( i = 0,j = 0; i < sl && j < pl; i++)
 {
  while (s[i] != pat[j]&& j>0)
  {
   j = failure[j -1]+1;
  }

  if (s[i] == pat[j])
  {
   j++;
  }
 }
 delete []failure;
 return j == pl ? i-pl :-1;
}