題目鏈結:
題目描述:
給定兩個字串 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 當然我們現在一眼就可以看出來最長公...