///*問題:給出兩個字串,找出它們的最長公共子串行
什麼是最長公共子串行?
最長公共子串行,英文縮寫為lcs(longest common subsequence)。
其定義是,乙個序列 s ,如果分別是兩個或多個已知序列的子串行,
且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。
而最長公共子串(要求連續)和最長公共子串行是不同的(可以是不連續的)
例如:abgfjlmnp
- - - -
afkqln
-- --
它們的最長公共子串行是:afln
思路:利用動態規劃方法
設兩個子串行x=,y=
設c[i,j]用來儲存xi和yj的lcs長度(i=0,1... j=0,1,...)
可以得到遞推方程:
___| 0 i=0 or j=0
c[i,j]=|_ c[i-1,j-1]+1 i,j>0 and xi=yi
|__ max i,j>0 and xi!=yi
根據公式可以得知c[i,j]儲存當前(xi,yi)的最大子串行長度
知道了最長公共子串行的長度,下一步就是考慮如何輸出這個序列
為了輸出子串行我們需要增加乙個陣列pos[i,j]
pos[i,j]用來儲存c[i,j]的解是由哪乙個子問題的解得到的
有三種情況:
1: c[i,j]:=c[i-1,j-1]+1;
pos[i,j]:="↖";
2: c[i,j]:=c[i-1,j];
pos[i,j]:="↑";
3: c[i,j]:=c[i,j-1];
pos[i,j]:="←"
構造子串行時:
從pos[m,n]開始向前掃瞄:
1.當pos[i,j]中遇到"↖"時(意味著xi=yi是lcs的乙個元素),
表示xi與yj的最長公共子串行是由xi-1與yj-1的最長公共子串行在尾部加上xi得到的子串行;
2.當pos[i,j]中遇到"↑"時,表示xi與yj的最長公共子串行和xi-1與yj的最長公共子串行相同;
3.當pos[i,j]中遇到"←"時,表示xi與yj的最長公共子串行和xi與yj-1的最長公共子串行相同。
字串的最長公共子串行問題
問題 給出兩個字串,找出它們的最長公共子串行 什麼是最長公共子串行?最長公共子串行,英文縮寫為lcs longest common subsequence 其定義是,乙個序列 s 如果分別是兩個或多個已知序列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。而最長公共子...
最長公共字串和最長公共子串行
給出兩個字串,找到最長公共子串,並返回其長度。建立乙個矩陣來儲存兩個字串出現相同字元的地方,比如 abccd 和 abcefc 就有 abccd a10000 b02000 c00300 e00040 f00000 c00100 這樣就有每次遇到相等的都加上下他的斜上方的位置的值,然後使用乙個max...
字串中最長公共子串行和最長公共子串
例 bdcaba和abcbdab,最長公共子串行為 bcba。dp解法 字串1的長度為length1,字串2的長度為length2,建立乙個二維陣列c length1 length2 用來記錄最長公共子串行的長度,狀態轉移方程為 整個狀態轉移以及二維陣列矩陣c為 生成字串長度加1的0矩陣,m用來儲存...