116. Leetcode 1143. 最长公共子序列 (动态规划-子序列问题)
生活随笔
收集整理的這篇文章主要介紹了
116. Leetcode 1143. 最长公共子序列 (动态规划-子序列问题)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?
步驟一、確定狀態(tài):
確定dp數(shù)組及下標(biāo)含義
dp[i][j]:長度為[0, i - 1]的字符串text1與長度為[0, j - 1]的字符串text2的最長 公共子序列為dp[i][j]
步驟二、推斷狀態(tài)方程:
主要就是兩大情況: text1[i - 1] 與 text2[j - 1]相同,text1[i - 1] 與 text2[j - 1]不相同
如果text1[i - 1] 與 text2[j - 1]相同,那么找到了一個公共元素,所以 dp[i][j] = dp[i - 1][j - 1] + 1;
如果text1[i - 1] 與 text2[j - 1]不相同,那就看看text1[0, i - 2]與text2[0, j - 1]的最長公共子序列 和 text1[0, i - 1]與text2[0, j - 2]的最長公共子序列, 取最大的。
即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
步驟三、規(guī)定初始條件:
初始條件:
全局初始化都是0
步驟四、計(jì)算順序:
從遞推公式,可以看出,有三個方向可以推出dp[i][j], 如圖:
?
從前向后,從上到下來遍歷這個矩陣。 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:if not text1 or not text2:return 0len1, len2 = len(text1) + 1, len(text2) + 1dp = [[0 for _ in range(len1)] for _ in range(len2)] # 初始化for i in range(1, len2):for j in range(1, len1):if text2[i-1] == text1[j-1]:dp[i][j] = dp[i-1][j-1] + 1else:dp[i][j] = max(dp[i][j-1], dp[i-1][j])return dp[-1][-1] 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的116. Leetcode 1143. 最长公共子序列 (动态规划-子序列问题)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 115. Leetcode 718. 最
- 下一篇: 118. Leetcode 392. 判