給定兩個字串,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...