NC127 最长公共子串

题目描述

给定两个字符串str1和str2,输出两个字符串的最长公共子串
题目保证str1和str2的最长公共子串存在且唯一。
(子串意味着是连续的)

输入

"1AB2345CD","12345EF"

返回值

"2345"

动态规划法

先确定状态,f(i, j)表示str1中前i个字符和str2中前j个字符中的最长公共子序列的长度

但这样写不出状态转移方程,因为这里 求解公共连续字符串 是没法形成递推关系的,因此增加限制条件:

f(i, j)表示str1中前i个字符和str2中前j个字符中的最长公共子序列的长度,且以第i个字符和第j个字符为结尾

可以简单写出状态转移方程

str1[i] == str2[j] 时,f[i][j] = f[i-1][j-1] + 1

str1[i] != str2[j] 时,f[i][j] = 0

但还有个问题,这个动态规划不能直接得到答案,需要用变量maxLength保存最长的长度

边界条件为:

i = 0 或 j = 0 时, f[i][j] = 0

class Solution:
    def LCS(self , str1 , str2 ):
        
        maxLen = 0
        endIndex = 0
        
        f = [[0 for j in range(len(str2)+1)] for i in range(len(str1)+1)]
        
        for i in range(1, len(str1)+1):
            for j in range(1, len(str2)+1):
                if (str1[i-1] == str2[j-1]):
                    f[i][j] = f[i-1][j-1] + 1
                else:
                    f[i][j] = 0
                if maxLen < f[i][j]:
                    maxLen = f[i][j]
                    endIndex = i # end index of the first string
        
        # print(maxLen)
        return str1[endIndex-maxLen:endIndex]

 

此题可以对比  最长公共子序列 一起看

 

参考:

https://www.nowcoder.com/activity/oj

 

posted @ 2021-03-18 02:15  sbj123456789  阅读(207)  评论(0编辑  收藏  举报