最长公共子串

来源:互联网 发布:焦虑思维 知乎 编辑:程序博客网 时间:2024/06/03 15:05
题目描述:给出两个字符串,找到最长公共子串,并返回其长度。

样例:给出A=“ABCD”,B=“CBCE”,返回 2


首先得明白子串和子序列的区别,子序列是要保持顺序不变的元素组成的序列,也就是说,不一定要连续,但是子串是要顺序不变,同时还必须连续。

如果你已经学习过之前我讲的对“两个字符串”这种动态规划问题的解法(例如:点击打开链接,点击打开链接等等),那么这道题就一点都不难,将最优子结构(也就是状态转移方程)变换即可。

现在用一个二维表格record记录结果,,record[i][j]表示B的前 j 项与A的前 i 项中以B[j]为结尾元素的子序列的长度。那样例来说,record[2][1]就是"ABC"和"CB"中以字符"B"为结尾的子串的长度,这个值显然就是0.

自然,有这样的规律,如果A[i] == B[j],那么record[i][j] = record[i - 1][j - 1] + 1,这样,就不难通过迭代计算出整个二维数组,最后,数组的最大值也就是我们要求的最终结果。

如果你没有做前面的几道题,这个逻辑理解起来可能有困难,所以建议你先去学习前面的东西(也就是上面链接给出的)。

代码如下:

class Solution:    # @param A, B: Two string.    # @return: the length of the longest common substring.    def longestCommonSubstring(self, A, B):        m = len(A)        n = len(B)        if m == 0 or n == 0:            return 0        record = [[0 for j in range(n + 1)] for i in range(m + 1)]        i = 1        temp = 0        while i <= m:            j = 1            while j <= n:                if A[i - 1] == B[j - 1]:                    record[i][j] = record[i - 1][j - 1] + 1                j += 1            temp = max(max(record[i]), temp)            i += 1        return temp        # write your code here          
还可以通过滚动数组,节约空间。

0 0
原创粉丝点击