動態規劃求解最長公共子串行(LCS)

2021-07-14 19:30:10 字數 1766 閱讀 8457

看了《演算法導論》中文第二版p208的動態規劃求解lcs問題,覺得很讚,但總覺得算導寫得有些晦澀,希望自己能寫得簡單易懂一些,純當鍛鍊了,歡迎指導交流。

首先,子串行和子串是不一樣的。子串是連續的,而子串行中的元素組成可以是不連續的,但元素的位置下標一定是遞增的。以乙個字串s = "abcdef"為例,字串s的乙個子串是"abc",'cdef'這種連續的,而子串行可以是"abc",也可以是"af ",給人的直觀感覺就是用s中的字元拼湊成的,但f一定在a之前。

我們設有兩個字串x和y,其中,x=,y=。用lcs(i , j)表示字串x與y的最長公共子串行的長度。

由動態規劃思想可知,問題的最優解是由子問題的最優解構成的,所以lcs(i,j) 的值與lcs(i-1, j-1), lcs(i-1, j), lcs(i, j-1) 都有一定的關係。

要確定lcs(i,j)的值,首先比較一下xi, yj 的值,有以下2種情況:

1. xi == yj,說明xi與yj 一定在最長公共子串行中,所以lcs (i , j) 是由lcs(i-1,j -1)之前的值決定的,即

lcs(i,j) = lcs(i-1, j-1) + 1;

2. xi != yj ,設在最長公共子串行中的最後乙個值為zk,可能zk == xi,也可能zk == yj,也可能zk與xi, yj的值都不同。

這3種情況的分析如下:

a. zk == xi, 那麼最長公共子串行取決於去掉yj的y字串與x字串的最長公共子串行,

即lcs(i, j) = lcs(i, j-1);

b. 與a同理,若yj在最長公共子串行中,那麼lcs(i, j) = lcs(i - 1, j);

c. zk與xi, yj的值都不同,那麼lcs( i, j ) 的值取決於去掉xi的x字串與去掉yj的y字串的最長公共子串行的長度,即

lcs(i, j) = lcs( i-1, j-1)。

結合a,b,c的情況,因為最長公共子串行必有最大的長度,所以

lcs(i, j) = max ( lcs( i-1, j) , lcs( i, j-1) )。這個公式之所以包含情況c,是因為在情況c下,最長公共子串行的最後乙個

值zk肯定是xi與yj之前的位置上的值,xi 與yj 在這種情況下對最長公共子串行的長度沒有影響力,所以在這種情況下,

lcs( i-1, j) 和 lcs( i, j-1)都等於lcs (i -1, j -1),可歸併到公式中。

因此,我們有:

當xi == yj 時,lcs(i,j) = lcs(i-1, j-1) + 1;

當xi != yj 時, lcs(i, j) = max ( lcs( i-1, j) , lcs( i, j-1) )。

分析完畢,可以練練手了,poj的1458題正是lcs的題。

lcs的一般**如下:

[cpp]view plain

copy

intlcs(string sx, string sy)  

//求解lcs

intmax = 0;  

for(

inti = 0; i 

else

}  else

//其他lcs[i][j]的值

if(lcs[i][j] > max)   

max = lcs[i][j];  

}  }  

//釋放動態二維陣列

for(

inti = 0; i 

delete

lcs;  

return

max;  

}  

最長公共子串行 動態規劃求解

問題 例如 x y 那麼,二者的最長公共子串行是,長度為4。我們首先需要搞清楚以下兩個概念 最長公共子串行 vs 最長公共子串 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。上述問題中的最長公共子串行與最長公共子串是一樣的。但是再舉例x y 二者的最長公共...

ACM 最長公共子串行 動態規劃求解

最長公共子串行問題 給你兩個字串a m b n 求出他們的公共子字串的長度 子字串不需要再原字串中連續 這個問題的一般想法是 1.找出a m 中的每個子字串 2.看其是否也能存在在b n 中 3.找出公共子字串中最大的乙個。然而這個方法對於計算機來說實在是過於複雜,比較好的方法是使用動態規劃的方法 ...

使用動態規劃求解最長公共子串行(LCS)

給出兩個字串,求其最長公共子串行的長度 lcs 如 abcdefghij badfhcajie其lcs為a d f h j,則輸出5 注意子串行和子串是不同的,子串必須連續,子串行只要按順序就行了,中間可以跳過某個字元。設字串a的長度為m,b的長度為n,suba i 表示a的前i個字元的子串 則lc...