1 8 動態規劃之最大公共子串問題。

2021-10-22 05:38:08 字數 1098 閱讀 5153

給定兩個字串,str1、str2,求返回倆字串最長公共子串。

分析:1)本題與求最長公共子串行相似,但又有所不同。在求子序列問題中,動態規劃通式i、j位置的值取決於三個位置,dp[i-1][j-1] dp[i-1][j] dp[i][j-1], 三者中,

2)先假設最後乙個字元相等,納入最長子序列中,那麼如果只改變乙個變數,不論是i或者是j加一,因為原有子串行已達到最長且最邊界的情況,只增加其中乙個序列是無法影響最長公共子串行的,此時i、j都增加乙個元素且該元素相等才有可能會影響

3)最後乙個字元不相等,那沒什麼好說的,兩邊i、j各自減去乙個字元的最長子序列的最大值便是i、j的最長子序列值。

4)在本題中,求最長公共子串,若按照求子序列一樣的引數設定顯然不行,子串是連續的,此時dp**中的資料應該代表什麼?子串是連續的資料,那麼我們在已知的資料前提下,對i、j進行增加,所得到的新的資料i+1、j+1需要與i、j緊密聯絡,那麼只有i、j的值相等,這樣i+1、j+1才會對原來的數值有影響,如此可得出表中資料應該為,以i、j為最後乙個公共子串元素的情況下,最長公共子串的長度。

5)由4)得出,dp[i][j]的資料代表著以元素str1[i] str2[j]為尾節點的情況下,最長公共子串的長度值,那麼我們可以輕易得出,[i+1][j+1]處的值僅取決於str1[i+1] == str2[j+1] ? 相等則用i、j位置的值+1,不相等則為 [i-1][j]和[i][j-1]位置的值取較大值

**實現:

1)本題中,能否通過常規動態規劃的方法壓縮空間?

嘗試列出隨意乙個矩陣,不難發現,矩陣中數列呈斜線狀排列。嘗試推導:也沒啥好推導的,就忒明顯了,從公式和資料上看都非常明顯。

public string list

(string str1 , string str2)

else

//最大值的更新

if(len > max)

i++; j++

}//這裡斜下方遍歷完,開始移動

if(right >0)

else

return str1.

substring

(end-max-+1

,end+1)

;}

動態規劃解最大公共子串

子串是連續的 一 刻畫最優解結構特徵 用c i,j 表示以a i b j 結尾的最大公共子串中的字元數。則max c i,j 0 i len a 1,0 j len b 1 表示a和b最大公共子串的字元數。同時在求解過程中可以確定i和j,這樣也就確定了這個公共子串。二 遞迴定義最優解的值 c i,j...

java 動態規劃最大公共子串行問題

剛開始按照自己的思路寫出來結果是不多了,而且還出現了陣列越界異常,在一點點的修改下,終於對了,但是還有很多可以改進的地方 package first 最長公共子串行 public class lcs string b new string int m a.length int n b.length ...

最大公共子串行,最大公共子串,最大回文子串

1 兩個字串中最長公共子串行 該問題是動態規劃的經典問題,找出的公共序列不一定是連續的,參考資料很多,這裡就貼出公式和 做個簡單的筆記。設序列a,b的長度分別為n和m,l i,j 為a i b j 的最長公共子串行長度,有遞推公式 時間複雜度為o mn 如下 define n 50 intlcs c...