《編程之美》:最長公共子序列(串)

求最長公共子串有兩種情況:1, 不要求子串連續,兩個字符串BDCABAABCBDAB,字符串BCBA和BDAB都是它們的最長公共子串。2, 要求子串連續。對於上面兩個串來說,BD和AB是它們的最長公共子串。
一,有關連續的已經寫過。設定一個矩陣p,p[i][j]表示以str1[i]和str2[j]結尾的子串的最大公共子串的長度。所以有遞推式:
如果 str1[i] != str2[j], p[i][j] = 0.
如果 str1[i]  = str2[j], p[i][j] = p[i-1][j-1] + 1.
二,如果不要求子串連續,處理有一些小的區別。還是設定一個矩陣p,p[i][j]表示str1[i]和str2[j]之前的子串最大公共子串的長度(不需要一定包含str1[i]或str2[j]),也就是說即使str1[i]和str2[j]不相等,也不能把p[i][j]清零。因爲題目要求的子串不一定是連續的。所以這種情況的遞推式爲:
如果 str1[i] != str2[j], p[i][j] = max(p[i-1][j],  p[i][j-1, p[i-1][j-1]).
如果 str1[i]  = str2[j], p[i][j] = p[i-1][j-1] + 1.
而p[i-1][j-1]肯定小於前兩者,所以第一個條件可改爲:p[i][j] = max(p[i-1][j],  p[i][j-1])。
爲了避免重複計算或者浪費不必要的空間,可以從開始往後遞推。

發佈了103 篇原創文章 · 獲贊 3 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章