leetcode 1143 最長公共子串行

2021-10-07 16:19:52 字數 2176 閱讀 8292

給定兩個字串 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

輸入的字串只含有小寫英文本元。

dp的經典題目了,轉移方程:

d p[

i][j

]=

dp[i][j] = \begin dp[i-1][j-1] + 1,& \;\; if \;\; text1[i] == text2[j] \\ max(dp[i-1][j], dp[i][j - 1]),& \;\; if \;\; text1[i] \neq text2[j] \end \end

dp[i][

j]={

dp[i

−1][

j−1]

+1,m

ax(d

p[i−

1][j

],dp

[i][

j−1]

),​i

ftex

t1[i

]==t

ext2

[j]i

ftex

t1[i

]​=

text

2[j]

​​其含義為:

如果text1[i] == text2[j],則最大長度應該是text1去掉itext2去掉j的兩個字串匹配的結果+1

如果text1[i] != text2[j],則要麼用text1去掉itext2匹配,要麼用text1text2去掉j匹配

class

solution

:def

longestcommonsubsequence

(self, text1:

str, text2:

str)

->

int:

dp =[[

0]*(

len(text1)+1

)for _ in

range

(len

(text2)+1

)]for i in

range(1

,len

(text2)+1

):for j in

range(1

,len

(text1)+1

):if text2[i -1]

== text1[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

]

LeetCode1143 最長公共子串行

題目描述 給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行。乙個字串的 子串行 是指這樣乙個新的字串 它是由原字串在不改變字元的相對順序的情況下刪除某些字元 也可以不刪除任何字元 後組成的新字串。例如,ace 是 abcde 的子串行,但 aec 不是 abcde 的子串行。...

LeetCode 1143 最長公共子串行

給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行。乙個字串的 子串行 是指這樣乙個新的字串 它是由原字串在不改變字元的相對順序的情況下刪除某些字元 也可以不刪除任何字元 後組成的新字串。例如,ace 是 abcde 的子串行,但 aec 不是 abcde 的子串行。兩個字串的...

最長公共子串行 LeetCode 1143

給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行。若這兩個字串沒有公共子串行,則返回 0。乙個字串的子串行是指這樣乙個新的字串 它是由原字串在不改變字元的相對順序的情況下刪除某些字元 也可以不刪除任何字元 後組成的新字串。例如,ace 是 abcde 的子串行,但 aec 不...