【刷题】LCS算法-最长公共子序列

本文详细解析了求解两个字符串的最长公共子序列与最长公共子串的算法,通过动态规划方法,提供了具体的实现代码示例,帮助读者深入理解这两种常见算法的区别与应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求两个字符串的公共最长序列。

例如,

  • 输入:‘acbde’ , ‘cfebd’
  • 输出:3 (最长的公共子序列为’cbd’)

动态规划:

  • i == 0 or j == 0, dp[i][j] = 0
  • A[i] == B[j], dp[i][j] = dp[i−1][j−1]+1
  • A[i] != B[j], dp[i][j] = max(dp[i−1][j], dp[i][j−1])
class Solution:
    def findLength(self, A: List[int], B: List[int]) -> int:
        m = len(A)
        n = len(B)
        dp = [[0 for _ in range(m + 1)] for _ in range(n + 1)]
        for i in range(n + 1):
            for j in range(m + 1):
                if i == 0 or j == 0:
                    dp[i][j] = 0
                elif B[i - 1] == A[j - 1]:
                    dp[i][j] = dp[i - 1][j - 1] + 1
                else:
                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
        return dp[-1][-1]

特别强调:
注意区分这两个概念:

  1. 最长公共子序列
  2. 最长公共子串

最长公共子串要求的是连续,而最长公共子序列不一定连续;
所以例子中的两个字符串’acbde’,‘cfebd’:

  1. 输出 3 ‘cbd’
  2. 输出 2 ‘bd’

动态规划的条件差不多:

  • i == 0 or j == 0, dp[i][j] = 0
  • A[i] == B[j], dp[i][j] = dp[i−1][j−1]+1
  • 最后输出要输出最大值
class Solution:
    def findLength(self, A: List[int], B: List[int]) -> int:
        m = len(A)
        n = len(B)
        dp = [[0 for _ in range(m + 1)] for _ in range(n + 1)]
        for i in range(n + 1):
            for j in range(m + 1):
                if i == 0 or j == 0:
                    dp[i][j] = 0
                elif B[i - 1] == A[j - 1]:
                    dp[i][j] = dp[i - 1][j - 1] + 1
        return max(max(row) for row in dp)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值