最长重复子串.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
最长重复子串 湖南长沙市雅礼中学 龙凡 【关键词】 扩展KMP算法 二分 后缀数组 后缀树 【引言】 近些年来,字符串类型的试题越来越多的出现在信息学竞赛中。而字符串处理中常常出现的一类问题即——最长重复子串。本文将讨论最长重复子串问题及它的几种变形,并给出实际应用中效果较好的解决该类问题的几种方法。 文中将涉及到使用扩展KMP、后缀数组等工具性算法。这些算法的具体方法与实现请参考近年来的国家集训队论文。 【连续最长重复子串】 问题描述 给定一个长度为N的字符串 S。记 为S的第I个字符到第J个字符所组成的子串。若存在,则称S存在一个长度为K的连续重复子串。现在要你求出K的最大值,满足存在一个值I使得。 基于二分的算法 枚举K,然后扫描的方法的时间复杂度高达O(N2),效果并不能让人满意。我们需要更高效的算法,这里给出一个基于二分结合扩展KMP算法的算法,时间复杂度为O(Nlog2N)。 在介绍主算法之前,我们先来简要介绍扩展KMP算法,这里并不对扩展KMP算法具体如何实现进行介绍,仅仅为了方便读者理解,介绍扩展KMP算法的功能。具体的扩展KMP算法的实现,请参考2003年国家集训队林希德的论文。 扩展KMP算法:对于一个主串S,和一个模式串T。记。而扩展KMP算法可以在O(Len(S)+Len(T))时间复杂度内求解q(1)…q(len(s))。 现在回到主算法,对于一个给定的串S。设Ans(S)为该串的连续最长重复子串长度。那么可以知道: 其中Cross(l,r,mid)表示:在s(l,r)中,包含s(mid)和s(mid+1)这两个字符的连续最长重复子串长度。根据上面的性质,我们二分求解Ans(S(l,r)),令。如果我们能够在O(r-l)的时间复杂度内求解Cross(l,r,mid),则我们可以在O(nlog2n)的时间复杂度内求解Ans(s(1,n))。 我们分两种情况来讨论包含s(mid)、s(mid+1)这两个字符的连续重复子串的出现情况: 设重复情况为,且。 注意上图,红色的分界线表示mid的分界线。这是一个k=4时候的情况,注意到图中黄色的部分和蓝色的部分要求对应相等。我们枚举mid在重复子串中的对称位置j(用绿色的分界线表示),从图中可以我们总结出连续重复子串的出现条件: 设West(j)表示当Mid的对称位置为j时,图中黄色相等部分可以延伸的长度。 设East(j)表示当Mid的对称位置为j-1时,图中蓝色相等部分可以延伸的长度。 则:当我们枚举了Mid的对称位置j,当且仅当时,存在一个连续重复子串长度k=mid-j的连续重复子串。 设重复情况为,且 与情况1类似,枚举了mid的对称位置j之后。当且仅当时存在一个连续重复子串长度k=j-mid的连续重复子串。 可以知道,在预先算出了West(l)…West(r)和East(l)…East(r)数组之后,处理上述两种情况的时间复杂度为O(r-l)。那么如何预先算出West数组和East数组呢?通过分析我们发现: 设Rotate(S)表示S字符串的逆字符串:比如Rotate(‘123’)=Rotate(‘321’)。 则West数组事实上是Rotate(s(l,r))作为母串,Rotate(s(l,mid))作为模式串时,扩展KMP算法求得的Q数组。而East数组则是S(l,r)作为母串,s(mid+1,r)作为模式串时,扩展KMP算法求得的Q数组。 我们只要预先执行两次扩展KMP算法,就能在O(r-l)的时间复杂度内求得West数组和East数组。那么我们计算Corss(l,r,mid)的时间复杂度也为O(r-l),也就是说我们可以利用二分配合扩展KMP算法在O(N log2N)的时间复杂度内求得Ans(S(1,n)),即我们要求的答案。 其他解决方法 上面,我们给出了O(N log2N)的时间复杂度内利用二分+扩展KMP求解连续最长重复子串的算法。事实上,这道题目利用后缀树配合扩展KMP,可以在O(N*Log2Σ)的时间复杂度内解决(其中Σ是字符串涉及的字符集大小)。由于后缀树实现较为复杂,并且对空间要求较高,这里就不作介绍了。有兴趣的读者可以参考2003年国家集训队员林希德的论文。 【连续重复子串的扩展】 问题的扩展 给出一个长度为N的字符串S以及整数g。有多少对不同的i、j使得: ,且。 题目来源:UVA 10829 L-Gap Substring,原题 算法分析 这道题目相比经典的连续最长重复子串问题,有两点不同: 题目中有一个g的参量,这个参量的意义相当于两个重复子串之间的间隔长度。当g=0时即连续重复子串。 题目需要我们给出

文档评论(0)

精品报告 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档