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

2021-07-26 03:30:54 字數 1037 閱讀 8586

現在有兩串字串str1和str2,要求它們的最長公共子串行。首先要說的是,子串行的各字元可以是在原來的母串中分開的,但是前後是有序的,而子串的各字元則必須是在母串中連續挨著的。子串和子串行不要搞混。

要求它們的最長公共子串行,如果剛學習演算法,那初學者肯定會想到一種很簡單暴力的方法,就是先從str2中拆出若干個子串行,再將它們檢查是否是str1的子串行,再選出最長的那個。這樣顯然很糟糕,因為你的時間開銷已經**性增長了,不可取。那麼下面就說一種動態的方法求lcs長度。(lcs即為最長公共子串行)

動態規劃的思想首先要說乙個情形:

str1=

str2=

lcs=(lcs為str1與str2的最長公共子串行)

①如果xm == yn,那麼lcs=是str1與str2的lcs

②如果xm != yn,那麼lcs=是str1與str2的lcs 

或者是str1與str2的lcs

以上可以想到乙個遞迴過程的思想,但遞迴的代價有點大,不值得,浪費了一些時間,那麼就用乙個過程二維陣列lcs 來紀錄過程把遞迴轉化成非遞迴,這裡就是動態規劃的精髓了。 對於

str1=

,str2=(注意:**中串下標從0開始)

初始化lcs[0,1,2,...m][0,1,2,...n],先把二維陣列lcs置0.

①如果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] );

其中i,j初始為1,j++迴圈後i++.

下面給出**演示:

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

1.描述 給定兩個序列 x y 求x和y的乙個最長公共子串行。2.分析 設最長子序列 z 則 1 若 xm yn 則 zk xm yn,且z k 1 是 x m 1 和 y n 1 的最長公共子串行 2 若 xm yn 且 zk xm 則 z 是 x m 1 和 y 的最長公共子串行 3 若 xm ...

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

首先,動態規劃的關鍵是將之前所計算的結果儲存起來,之後直接呼叫!1.問題描述 字串的子串行 是指從該字串中去掉任意多個字元後剩下的字元在不改變順序的情況下組成的新字串。最長公共子串行 是指多個字串可具有的長度最大的公共的子串行。比如 adbcbd bdcaba這兩個字串的最長公共子串行是dcb 2....

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

最長公共子串行也是動態規劃中的乙個經典問題。有兩個字串 s1 和 s2,求乙個最長公共子串,即求字串 s3,它同時為 s1 和 s2 的子串,且要求它的長度最長,並確定這個長度。這個問題被我們稱為最長公共子串行問題。與求最長遞增子串行一樣,我們首先將原問題分割成一些子問題,我們用 dp i j 表示...