从最长公共子串到后缀自动机(LCS->SAM)

本文深入探讨了从最长公共子串问题到后缀自动机(SAM)的转换,介绍了后缀自动机的历史、理论基础和构造方法。通过线性时间复杂度的算法,解决了字符串处理中的效率难题,并展示了后缀自动机在多种字符串查询问题中的应用,如子串存在性、不同子串个数和总长度等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Longest Common Substring—Suffix Automaton

本文将从最长公共子串开始说起,循序渐进的讲解后缀自动机,希望通过自己的理解帮助到大家,文章目录如下:

  • 最长公共子串问题
  • 后缀自动机历史
  • 后缀自动机简介
  • 后缀自动机相关理论基础
  • 如何构造后缀自动机
  • 后缀自动机的应用
  • 总结

最长公共子串问题

首先来看一到经典的例题

题目:给出N个长度不超过100000的字符串,求他们的最长公共连续子串
时限:2s
备注:设
  X = <a, b, c, f, b, c>
  Y = <a, b, f, c, a, b>
Longest Common Sequence 公共最长子序列<a, b, c, b>,长度为4
Longest Common Substring 公共最长子串<a, b>长度为2
与Subsequence问题不同的是,Substring问题不光要求下标序列是递增的,还要求每次
递增的增量为1, 即两个下标序列为:
<i, i+1, i+2, ..., i+k-1> 和 <j, j+1, j+2, ..., j+k-1>

题解:用经典的动态规划来实现,时间复杂度O(n^2)
c[i][j]表示Xi和Yi的最大Substring的长度,比如
   X = <y, e, d, f>
   Y = <y, e, k, f>
   c[1][1] = 1
   c[2][2] = 2
   c[3][3] = 0
   c[4][4] = 1 (Sequence:c[4][4]==3)

   动态转移方程为:
   如果xi == yj, 则 c[i][j] = c[i-1][j-1]+1
   如果xi ! = yj,  那么c[i][j] = 0
   最后求Longest Common Substring的长度等于
   max{  c[i][j],  1<=i<=n, 1<=j<=m}

动归核心算法:
for(i = 1 ; i < len1+1 ; i++)  
{  
        for(j
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值