動態規劃之最長公共子串行

2021-10-08 14:52:38 字數 1608 閱讀 2118

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

思路:典型動態規劃,

dp[i][j]定義:text1前i個字元和text2前j個字元的最長公共子串行

base case:其中任何乙個為空,dp[i][0]=dp[0][j]=0

狀態轉移方程:text[i]==text[j]時.dp[i][j]=dp[i-1][j-1]+1

text[i]!=text[j]時,dp[i][j]=max(dp[i][j-1],dp[i-1][j])

看**

class

solution

:def

longestcommonsubsequence

(self, text1:

str, text2:

str)

->

int:

m =len(text1)

n =len(text2)

dp =[[

0]*(n +1)

for _ in

range

(m +1)

]for i in

range(1

, m +1)

:for j in

range(1

, n +1)

:if text1[i -1]

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

]

動態規劃之最長公共子串行

最長公共子串行簡介 舉例說明並分析 塊測試結果 乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列,確切的說,若給定序列x 則另一串行z x的子串行是指存在乙個嚴格的下標序列,使得對於所有的j 0,1,k 1有zj xij。例如序列z 是序列x 的子串行,相應的遞增下標序列維。最長公共子串行問...

動態規劃之最長公共子串行

給出兩個字串,求出這樣的一 個最長的公共子串行的長度 子串行 中的每個字元都能在兩個原串中找到,而且每個字元的先後順序和原串中的 先後順序一致。sample input abcfbc abfcab programming contest abcd mnp sample output 4 2 0對於動...

動態規劃之最長公共子串行

最長公共子串行問題 time limit 1000 ms memory limit 65536 kib submit statistic discuss problem description 給定兩個序列x input 輸入資料有多組,每組有兩行 每行為乙個長度不超過500的字串 輸入全是大寫英文...