zoukankan      html  css  js  c++  java
  • 扩展kmp

    问题描述
    给定串S和T,设长度分别为n,m,依次计算出extend[0~n-1],extend[i]表示S的后缀S[i,n-1]与T的最长公共前缀。

    算法描述

    为了计算extend数组,我们先计算一个数组next[0~m-1],next[i]表示T的后缀T[i,m-1]与T[0,m-1]的最长公共前缀。

    假设已经计算出了next数组。现在借助于next数组,从前向后计算S的每个位置的extend值。假设当前遍历到位置i,即extend[0~i-1]都已经计算完。对于所有的$jin [0,i-1]$,j对应一个f(j)=j+extend[j]-1,设f(j)的最大值为p,取得p的位置为a,即p=f(a)。

    S串: 0 1 2 … a … i-1 i … p …

    对于a这个位置,有S[a,p]=T[0,p-a],那么有S[i,p]=T[i-a,p-a]

    要求extend[i],即S[i,n-1]匹配T[0,m-1],我们可以先用T[i-a,m-1]来匹配T[0,m-1],这正是next[i-a]表示的含义:T中位置i-a开始的后缀跟T的最长公共前缀长度。令L=next[i-a],分以下两种情况讨论:
    第一种 $i+L<p$,如下所示。那么有exend[i]=next[i-a](即L)。 

    第二种 $i+Lgeq p$,如下所示

    p+1及其之后我们不知道是不是匹配,所以要逐个比较。

    下面是计算extend的代码。

     1 void GetExtend(
     2         const char* S,const int nSLen,
     3         const char* T,const int nTLen,
     4         const int *Next,
     5         int *Extend)
     6 {
     7     int a,p,j=-1;
     8     for(int i=0;i<nSLen;++i,--j)
     9     {
    10         if(j<0||i+Next[i-a]>=p)
    11         {
    12             if(j<0) j=0,p=i;
    13             while(p<nSLen&&j<nTLen&&S[p]==T[j]) ++j,++p;
    14             Extend[i]=j;
    15             a=i;
    16         }
    17         else Extend[i]=Next[i-a];
    18     }
    19 }

    对于next的求法,显然与上面是一个过程,只是两个串一样:

     1 void GetNext(
     2         const char* S,const int nSLen,
     3         int *Next)
     4 {
     5     int a,p,j=-1;
     6     Next[0]=nSLen;
     7     for(int i=1;i<nSLen;++i,--j)
     8     {
     9         if(j<0||i+Next[i-a]>=p)
    10         {
    11             if(j<0) j=0,p=i;
    12             while(p<nSLen&&S[p]==S[j]) ++j,++p;
    13             Next[i]=j;
    14             a=i;
    15         }
    16         else Next[i]=Next[i-a];
    17     }
    18 }
  • 相关阅读:
    Java之JDK的下载与安装,java环境变量的配置,Editplus的下载与使用
    JAVA基础语法
    数据库设计
    数据库练习题
    连接查询,子查询,联合查询
    Java内存管理-掌握虚拟机类加载器(五)
    Java内存管理-掌握虚拟机类加载机制(四)
    Java内存管理-JVM内存模型以及JDK7和JDK8内存模型对比总结(三)
    Java内存管理-初始JVM和JVM启动流程(二)
    Java内存管理-程序运行过程(一)
  • 原文地址:https://www.cnblogs.com/jianglangcaijin/p/5992782.html
Copyright © 2011-2022 走看看