兩個字串的最長公共子串行 可以不連續

2021-09-10 08:56:11 字數 1223 閱讀 6407

動態規劃問題基本思路:        

動態規劃求解最優化問題應該具備的兩個要素:最優化子結構和子問題重疊。我的理解就是碰到問題先看看能不能把大問題化解為小問題解決,這就是我對最優子結構的理解。子問題重疊意思就是說,你在求子問題的時候一些工作是重複做了,看看能不能想辦法避免以下。

對於動態規劃的運用我還不是很熟練,但我在碰到問題時往往是這樣做的:先判斷原先的問題能不能化解為小問題,如果能化為小問題的話,怎麼求解,試著寫一下(遞推)公式。如果遞推公式寫成功了的話,恰巧符合動態規劃求解。自然而然就可以應用動態規劃了。動態規劃的應用最主要的就是寫出遞推公式。

思路:求最長公共子串行不要求求得的子字串時連續的,比如說acb和ab的最長公共子串行就是ab。而最長公共連續子串,要求求得的子串在兩個字串中必須是連續出現的,還是acb和ab他們的最長公共子串是a或者是b。這裡說的是求兩字串的最長公共子串行,用的是動態規劃。

下面言歸正傳,求兩個字串的最長公共子串行。借用演算法導論上的表示方法,給定乙個字串x=(下劃線後面的數字表示下標),另乙個字串y=,求x和y的最長公共子串行。同時我們用x_i表示x中前i個字元構成的字串x_i = ,用y_j表示y紅前j個字元構成的字串y_j = 。

現在就想怎麼把問題變為為小問題呢?怎麼解決這個問題呢?

關鍵要找到問題的突破口,先不要管最終解決,先想一想怎麼吧問題花姐的規模小一些。我先分別拿兩個字串的最後乙個字元「開刀」,先拿他們比較

(1)我們可以首先比較x_m和y_n如果這兩個字元相同,那麼x_m = y_n一定是最長公共子串行中的乙個字元。那麼我們的問題就是求x_(m-1) = 和y_(n-1) = 的最長公共子串行了。如果能求出x_(m-1)和y_(n-1)的最長公共子串行,這個子串行在加上字元x_m = y_n就是我們所求問題的最長公共子串行了。

(2)如果x_m != y_n,我們要求x和y的最長公共最序列,就轉為求兩個子問題,乙個是求x_m和y_(n-1)的最長公共子串行,另乙個是求x_(m-1)和y_n的最長公共子串行。取兩者中最長的那個就是問題的解。

假如用c[i,j]表示x_i和y_j序列的最大公共子串行的長度的話

**:

//求兩個字串的最大公共子串行 

int dp[105][105];

int findlcs(string str1,string str2)

兩個字串的最長公共子串行

解題分析 設兩個序列x y 用lsc x,y 表示最長公共子串行。1.如果xn yn。則該元素一定存在於公共子串行中,所以可化為尋求子問題lsc x 1,y 1 用公式可表示為lsc x,y lsc x 1,y 1 1。2.如果xn yn。則該元素不存在於公共子串行中,所以轉而去尋求兩個子問題,即l...

求兩個字串的最長公共子串行

autor baker time 25 5 06 求兩個字串的最長公共子串行。x的乙個子串行是相應於x下標序列的乙個子串行,求解兩個序列的所有子串行中長度最大的,例如輸入 pear,peach輸出 pea。分析 次題可用動態規劃演算法解決。首先定義乙個二維陣列 a a i j m g ddgg dd...

求兩個字串的最長公共子串行

方法 一 遞迴 採用遞迴的方法,簡單,但是速度比較慢,當字串比較大的時間,多次遞迴會計算一些重複的過程,因此速度很很慢。include using namespace std int lcslength int i,int j string x,y int lenx,leny int main re...