Leetcode talk36 最長公共子串行

2021-10-23 04:43:17 字數 2069 閱讀 4583

做了幾個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...