題目:
給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行的長度。
乙個字串的 子串行 是指這樣乙個新的字串:它是由原字串在不改變字元的相對順序的情況下刪除某些字元(也可以不刪除任何字元)後組成的新字串。
例如,"ace" 是 "abcde" 的子串行,但 "aec" 不是 "abcde" 的子串行。兩個字串的「公共子串行」是這兩個字串所共同擁有的子串行。
若這兩個字串沒有公共子串行,則返回 0。
思路:
使用動態規劃,dp[i][j] 的含義是:對於 s1[1..i] 和 s2[1..j],它們的 lcs 長度是 dp[i][j]。我們專門讓索引為 0 的行和列表示空串,dp[0][..] 和 dp[..][0] 都應該初始化為 0,這就是 base case。dp[0][3]=0 的含義是:對於字串 "" 和 "bab",其 lcs 的長度為 0。因為有乙個字串是空串,它們的最長公共子串行的長度顯然應該是 0。
如果i和j位置的字元相同:dp[i][j]=dp[i-1][j-1]+1。但是如果i位置和j位置的字元不同,那麼dp[i][j]=math.max(dp[i][j-1],dp[i-1][j]),其實這裡也可以加上dp[i-1][j-1],但是其實加不加效果都一樣,因為dp[i-1][j]和dp[i][j-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 當然我們現在一眼就可以看出來最長公...