void GetFail(char P[],int __next[])//__next[i]表示s[0]~s[i-1]的前缀中,最大长度相等的前后缀是多少 
{
    __next[0]=-1;
    int len=strlen(P);
    for(int i=0;i<len;i++)
      {
        int j=__next[i];
        while(j>=0&&P[i]!=P[j])
		  j=__next[j];
        if(j!=-1 && P[i]==P[j])
		  __next[i+1]=j+1;
        else __next[i+1]=0;
      }
}
int find(char T[],char P[],int __next[])
{
    int n=strlen(T),m=strlen(P);
    GetFail(P,__next); int j=0;
    for(int i=0;i<n;++i)
      {
        while(j&&P[j]!=T[i]) j=__next[j];//如果j变成0仍不能满足P[j]==T[i],则只增加i直到出现P[j]==T[i]为止。
        if(P[j]==T[i]) ++j;
        if(j==m) return i-m+1;
      }
    return -1;
}

相关文章:

  • 2022-12-23
  • 2021-10-08
  • 2022-12-23
  • 2021-06-18
  • 2022-12-23
  • 2022-01-24
  • 2021-09-25
  • 2021-08-28
猜你喜欢
  • 2022-02-01
  • 2022-01-26
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案