longest common subsequence,lcs
說明:子串行中的字元與子字串中的字元不同,它們不需要是連續的,例如:
字串1:bdcaba;字串2:abcbdab
最長公共子串行長度為4,最長公共子串行是:bcba
最優子結構
設兩個字串分別是x,y;其中x長度為n,y的長度為m。
lcs(xn,ym)就是求出x、y的最長公共子串行,而其中就有三個子問題:
考慮x與y的最後乙個字元是否一樣,我們可以將情況分為三類:
1.x與y的最後乙個字元一樣,則lcs(xn,ym)=lcs(xn-1,ym-1)+1
2.x與y的最後乙個字元不一樣,lcs(xn,ym)=lcs(xn-1,ym)
2.x與y的最後乙個字元不一樣,lcs(xn,ym)=lcs(xn,ym-1)
重疊子問題
例如當lcs(xn-1,ym)最後的字元不相同時,問題就包含lcs(xn-1,ym-1),lcs(xn-2,ym),所以要使用動態規劃進行記憶化搜尋
**解決
lcs可能存在不唯一的多條路徑:
如果格仔dp[i][j]
對應的x[i-1] == y[j-1]
,則把這個字元放入 lcs 中,並跳入dp[i-1][j-1]
中繼續進行判斷;
如果格仔dp[i][j]
對應的x[i-1] ≠ y[j-1]
,則比較dp[i-1][j]
和dp[i][j-1]
的值,跳入值較大的格仔繼續進行判斷;
直到 i 或 j 小於等於零為止,倒序輸出 lcs 。
如果出現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 當然我們現在一眼就可以看出來最長公...
最長公共子串 最長公共子串行
子串要求連續 子串行不要求連續 之前的做法是dp求子序列 include include include using namespace std const int inf 0x3f3f3f3f const int mod 1000000007 string s1,s2 int dp 1010 10...