最长公共子串
Last updated
Last updated
问题简述
思路1:动态规划(超时)
定义 dp(i, j)
表示以 s1[i - 1]
和 s2[j - 1]
结尾的最长公共子串;
注意:dp(i, j)
保存的并不是全局最优解,所以需要用全局变量来动态更新;
本题中,因为需要返回具体子串,所以可以保存两个变量,一个是结尾索引,一个是子串长度,根据这两个变量就可以找到具体的公共子串;
初始化 i == 0 or j == 0
时,dp(i, j) == 0
转移方程:dp(i, j) = dp(i - 1, j - 1) + 1 if s1[i - 1] == s2[j - 1] else 0
;
值得注意的是,当前状态 (i, j)
只跟 (i-1, j-1)
状态有关,这与常见的双样本位置对应模型不同(比如“编辑距离”);
具体来说,状态转移时没有用到 (i, j-1)
和 (i-1, j)
,但它们依然是要计算的,这在迭代写法中是自然的;但是在递归写法中很容易被忽略(因为转移方程中没有它们),详见递归写法的代码;
思路2
有一个超长用例导致上面的代码超时;
下面是另一种实现方式,本质上跟动态规划的思路是一样的;