給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行的長度。
乙個字串的 子串行 是指這樣乙個新的字串:它是由原字串在不改變字元的相對順序的情況下刪除某些字元(也可以不刪除任何字元)後組成的新字串。
例如,「ace」 是 「abcde」 的子串行,但 「aec」 不是 「abcde」 的子串行。兩個字串的「公共子串行」是這兩個字串所共同擁有的子串行。
若這兩個字串沒有公共子串行,則返回 0。
示例 1:
示例 2:輸入:text1 = "abcde", text2 = "ace"
輸出:3
解釋:最長公共子串行是 "ace",它的長度為 3。
示例 3:輸入:text1 = "abc", text2 = "abc"
輸出:3
解釋:最長公共子串行是 "abc",它的長度為 3。
輸入:text1 = "abc", text2 = "def"
輸出:0
解釋:兩個字串沒有公共子串行,返回 0。
dp的經典題目了,轉移方程:1 <= text1.length <= 1000
1 <= text2.length <= 1000
輸入的字串只含有小寫英文本元。
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
去掉i
,text2
去掉j
的兩個字串匹配的結果+1
如果text1[i] != text2[j]
,則要麼用text1
去掉i
和text2
匹配,要麼用text1
和text2
去掉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 不...