字串的最長公共子串行問題

2021-09-06 10:43:56 字數 1452 閱讀 4881

///*問題:給出兩個字串,找出它們的最長公共子串行

什麼是最長公共子串行?

最長公共子串行,英文縮寫為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用來儲存...