2021 1 16 刷題(最長公共子串行 動規)

2022-06-11 12:42:13 字數 1502 閱讀 1474

題目鏈結

題目描述

給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行的長度。

乙個字串的 子串行 是指這樣乙個新的字串:它是由原字串在不改變字元的相對順序的情況下刪除某些字元(也可以不刪除任何字元)後組成的新字串。

例如,"ace" 是 "abcde" 的子串行,但 "aec" 不是 "abcde" 的子串行。兩個字串的「公共子串行」是這兩個字串所共同擁有的子串行。

若這兩個字串沒有公共子串行,則返回 0。

示例 1:

輸入:text1 = "abcde", text2 = "ace"

輸出:3

解釋:最長公共子串行是 "ace",它的長度為 3。

示例 2:

輸入:text1 = "abc", text2 = "abc"

輸出:3

解釋:最長公共子串行是 "abc",它的長度為 3。

解題思路:

1.定義dp陣列

一般對於在兩個字串,或者是能拆解成兩個字串的問題當中,我們都定義乙個二維dp陣列。

dp[i][j]:表示在字串s[0...i]中和字串s[0...j]中最長公共子串行的長度為dp[i][j]

2.確定base case:s1或者s2為空串時,即dp[0][j]和dp[i][0]初始為0

3.確定【選擇】:s1[i]、s2[j]的值

4.確定【狀態】:dp[i][j]的值

5.確定【狀態轉移方程】

具體到每個字串的每乙個字元,只看s1[i]和s2[j],思考每個字元該做什麼能找出公共字元。

如果s1[i] == s2[j],說明這個字元一定在lcs中,所以可以推出dp[i][j] = dp[i-1][j-1]+1;

如果s1[i] != s2[j],說明s1[i]和s2[j]中至少有乙個字元不在lcs中,有以下三種情況:

其中,情況三被情況一和情況二包含,由於求最長公共子串行,找出兩者中的最大值即可。

**:

套入動態規劃模板即可得出:

class solution 

} // base case

if(s1.length() == 0 || s2.length() == 0) return 0;

for(i = 1; i <= m; i++)

else}}

return dp[m][n];}};

牛客刷題 最長公共子串

題目 給定兩個字串str1和str2,輸出兩個字串的最長公共子串,如果最長公共子串為空,輸出 1。輸入 1ab2345cd 12345ef 輸出 2345 看完題目想到了用動歸,剛開始分析的時候想著,對於每兩個元素的比較,有兩種情況,1.元素相同,那麼當前元素能夠成的最長公共子串的長度為上乙個的 1...

最長公共子串行 最長公共子串

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...

最長公共子串行 最長公共子串

1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...