第一章:经典动态规划:最长公共子序列

labuladong经典动态规划:最长公共子序列

1143. 最长公共子序列

(在dp数组中添加0行和0列可以包含text为空的情况,并且更便于状态转移)

  1. dp数组的含义: 对于 text1[0..i-1] 和 text2[0..j-1],dp[i][j]中保存当前位置的最长公共子序列的长度
  2. 状态转移方程:若当前元素相等,则在之前状态下+1 (dp[i][j]=dp[i-1][j-1]+1)。 若不相等,则继承之前的最大值(dp[i][j]=max(dp[i-1][j],dp[i][j-1])
  3. base case : 第0行和第0列初始化为0 。(至少有一个为空字符时,不可能有公共子序列 (两个都为空时,公共子序列长度也为0))
class Solution(object):
    def longestCommonSubsequence(self, text1, text2):
        if not (text1 and text2): return 0
        m=len(text1)
        n=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[-1][-1]

   转载规则


《第一章:经典动态规划:最长公共子序列》 M 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
第一章:动态规划之子序列问题解题模板 第一章:动态规划之子序列问题解题模板
labuladong 动态规划之子序列问题解题模板 516. 最长回文子序列 如果暂时想不到状态转移方程,可以先确定base case和最终状态,然后通过它们的相对位置,来猜测状态转移方程,猜测dp[i][j]可能从哪些状态转移而来。以本题
2020-07-31
下一篇 
第一章:经典动态规划:编辑距离 第一章:经典动态规划:编辑距离
labuladong经典动态规划:编辑距离 72. 编辑距离 在word1 和word2 前面分别插入"" 不仅可以包括字符串为空的情况,而且可以更清楚地用空字符串说明状态转移的过程 i 和 j 中,因为最前面加了&
2020-07-30
  目录