📌  相关文章
📜  找到一个字符串的最长子序列,它是另一个字符串的子字符串(1)

📅  最后修改于: 2023-12-03 15:10:05.600000             🧑  作者: Mango

找到一个字符串的最长子序列,它是另一个字符串的子字符串

这道题目可以使用动态规划来解决。

问题描述

给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。如果不存在公共子序列,返回 0。

动态规划思路

我们可以定义一个二维数组 dp[i][j],其中 i j 分别表示 text1text2 中的字符位置。我们可以按以下方式来定义 dp[i][j]

  • dp[i][j] 表示 text1[0 ... i - 1]text2[0 ... j - 1] 的最长公共子序列的长度。

那么,我们可以得到以下状态转移方程:

dp[i][j] = dp[i-1][j-1] + 1, 如果 text1[i-1] == text2[j-1]
dp[i][j] = max(dp[i-1][j], dp[i][j-1]), 如果 text1[i-1] != text2[j-1]

其中,第一个方程表示当 text1[i-1] == text2[j-1] 时,如果 text1[0 ... i - 2]text2[0 ... j - 2] 的最长公共子序列为 dp[i-1][j-1],那么我们在 dp[i-1][j-1] 的基础上再添加一个字符 text1[i-1]text2[j-1],就可以得到长度为 dp[i-1][j-1] + 1 的最长公共子序列。

第二个方程表示当 text1[i-1] != text2[j-1] 时,text1[0 ... i - 1]text2[0 ... j - 1] 的最长公共子序列一定是在 text1[0 ... i - 2]text2[0 ... j - 1] 或者 text1[0 ... i - 1]text2[0 ... j - 2] 中产生的,我们只需要取其中更长的那个即可。

最终,dp[len(text1)][len(text2)] 就是 text1text2 的最长公共子序列的长度。

代码实现

下面是 Python 实现的代码:

class Solution:
    def longestCommonSubsequence(self, text1: str, text2: str) -> int:
        m, n = len(text1), len(text2)
        dp = [[0 for _ in range(n+1)] for _ in range(m+1)]

        for i in range(1, m+1):
            for j in range(1, n+1):
                if text1[i-1] == text2[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[m][n]
总结

本题是一道比较基础的动态规划题目,需要注意状态转移方程的定义和实现。通过该题,我们可以加深对动态规划思想的理解,并掌握动态规划的基本套路。