题目描述
给定两个序列X=(X1,X2,…,Xm)和Y=(Y1,Y2,…,Yn),求X和Y的最长公共子串。
例如:输入两个字符串acbac和acaccbabb,则最大连续子串为cba, 则返回长度3。
解法一
参考之前关于最长公共子序列LCS的解法,我们发现LCS是一种通用的公共子序列,而子串是一种连续的子序列,所以需要修改递推公式。此处动态规划表格存放的内容有所不同,LCS是比较子串,当前问题是为了使用连续子串这一条件,所以考虑设数组dp[i,j]表示以Xi和Yj结尾的最大公共连续子串的长度,如果Xi=Yj,则dp[i,j]=dp[i-1,j-1]+1,只需要再考虑dp[i-1,j-1]这个子问题,如果不相等,则dp[i,j]=0,如果i=0或j=0,说明有一个字符串已经结束了,则dp[i,j]=0。需要注意的是,dp的含义决定了最后的输出结果不是dp[m,n],而必须在计算dp的过程中寻找最大值。
递归+memo:
1 | class Solution { |
解法二
自底向上的解法
1 | class Solution { |