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