最长公共子串

时间:2021-07-15
本文章向大家介绍最长公共子串,主要包括最长公共子串使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目描述:

给定两个字符串str1和str2,输出两个字符串的最长公共子串。
题目保证str1和str2的最长公共子串存在且唯一。

示例1

输入:
"12AB2345CD","123456EF"
返回值:
"2345"

方法一:

class Solution:
    def LCS(self , str1 , str2 ):
        # write code here
        temp1,temp2='',''
        for i in str1:
            temp1+=i
            if temp1 in str2:
                temp2=temp1
            else:
                temp1=temp1[1:]
        return temp2

代码分析:对于str1中的以每个字符为开头的字符串,判断是否存在与str2中,最后返回最长的。

方法二:

动态规划解决

注意这题求的是最长公共子串,不是最长公共子序列,子序列可以是不连续的,但子串一定是连续的。

定义dp[i][j]表示字符串str1中以第i个字符和str2种以第j个字符为最后一个元素所构成的最长公共子串,我们首先需要判断这两个字符是否相等。

  • 如果不相等,那么他们就不能构成公共子串,也就是
    dp[i][j]=0;

  • 如果相等,我们还需要计算前面相等字符的个数,其实就是dp[i-1][j-1],所以
    dp[i][j]=dp[i-1][j-1]+1;

代码实现:
class Solution:
    def LCS(self , str1 , str2 ):
        # write code here
        l1, l2 = len(str1), len(str2)
        dp = [['' for _ in range(l2 + 1)] for _ in range(l1 + 1)]
        ans = ''
        for i in range(l1):
            for j in range(l2):
                if str1[i] == str2[j]:
                    dp[i+1][j+1] = dp[i][j] + str1[i]
                    if len(dp[i+1][j+1]) > len(ans):
                        ans = dp[i+1][j+1]
        return ans



原文地址:https://www.cnblogs.com/WGJ909001/p/15010992.html