做了幾個dp的題之後,總結了dp需要注意的幾個要素:
1、 明確dp二維陣列表示的含義
2、base case
3、狀態的轉移:對於回文/lcs之類的問題則是考慮當前字串和已經計算過的子串之間的關係
4、由狀態的轉移來確定 loop的邊界
5、 由loop的邊界打出** 可得出最後乙個dp的狀態值,即結果。
給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行。
乙個字串的 子串行 是指這樣乙個新的字串:它是由原字串在不改變字元的相對順序的情況下刪除某些字元(也可以不刪除任何字元)後組成的新字串。
例如,「ace」 是 「abcde」 的子串行,但 「aec」 不是 「abcde」 的子串行。兩個字串的「公共子串行」是這兩個字串所共同擁有的子串行。
若這兩個字串沒有公共子串行,則返回 0。
示例 1:
輸入:text1 =
"abcde"
, text2 =
"ace"
輸出:3
解釋:最長公共子串行是 "ace",它的長度為 3。
示例 2:
輸入:text1 =
"abc"
, text2 =
"abc"
輸出:3
解釋:最長公共子串行是 "abc",它的長度為 3。
示例 3:
輸入:text1 =
"abc"
, text2 =
"def"
輸出:0
解釋:兩個字串沒有公共子串行,返回 0。
-
1<= text1.length <=
1000-1
<= text2.length <=
1000
- 輸入的字串只含有小寫英文本元。
1、對於s[1…i] s[1…j] lcs長度為 dp[i][j]
2、base case 乙個字串和自身沒有子串行 dp[0][j] = dp[i][0] = 0
3、dp[i][j] = dp[i-1][j-1] + 1
4、for i in range(n + 1):
for j in range(m + 1):
5、dp[-1][-1]
class solution:
def longestcommonsubsequence
(self, text1: str, text2: str)
->
int:
#dp s[
1..i] s[
1..j] lcs長度為 dp[i]
[j] n =
len(text1) # row
m =len(text2) # colum
dp =[[
0]*(m +1)
for_ in range
(n +1)
]for i in range
(n +1)
:for j in range
(m +1)
: dp[0]
[j]= dp[i][0
]=0for i in range(1
,n +1)
:for j in range(1
, m +1)
:if text1[i -1]
== text2[j -1]
: dp[i]
[j]= dp[i-1]
[j-1]+
1else
: dp[i]
[j]=
max(dp[i-1]
[j], dp[i]
[j-1])
return dp[-1
][-1
]
最長公共子串 NYOJ 36
時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 咱們就不拐彎抹角了,如題,需要你做的就是寫乙個程式,得出最長公共子串行。tip 最長公共子串行也稱作最長公共子串 不要求連續 英文縮寫為lcs longest common subsequence 其定義是,乙個序列 s 如果分...
最長公共子串 NYOJ 36
時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 咱們就不拐彎抹角了,如題,需要你做的就是寫乙個程式,得出最長公共子串行。tip 最長公共子串行也稱作最長公共子串 不要求連續 英文縮寫為lcs longest common subsequence 其定義是,乙個序列 s 如果分...
最長公共子串行 最長公共子串
1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...