演算法導論09 動態規劃 最長公共子串行

2021-10-09 03:26:35 字數 1025 閱讀 7085

問題描述:

設現有兩個子串行,請設計演算法計算其最長公共子串行。

問題分析:

此問題採用動態規劃來解決。動態規劃三步驟:

1 定義函式dp[i][j]。

2 找通項公式(常見dp[i][j]與dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1])之間關係。

3 求出初始值。

第一步:定義dp[i][j]

由於所求為兩個序列的最長子序列,因此dp[i][j]可表示為長度為i的a序列以及長度為j的b序列的最長公共子串行,如dp[2][4]表示長度為2的a序列和長度為4的b序列的最長公共子串行。

第二步:找通項公式

首先考慮dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1]的關係,可知,分別表示為a減去乙個末尾序列,b減去乙個末尾序列、ab同時減去乙個末尾序列的最長公共子串行。然後分析問題肯定與末尾序列有關係,末尾序列a[i]和b[j]有兩種關係,相等或者不相等。下面分類討論兩種情況下四個dp之間的關係。

case1:a [ i ] = b [ j ]

則dp [ i ] [ j ] = dp [ i-1 ] [ j-1 ]+1(注:dp[i][j]表示長度,+1為加上最後乙個序列),

case2:a [ i ] != b [ j ]

則dp[i][j] = max;(捨棄其中乙個序列的尾序列,繼續dp,並選擇最長值),

至此,dp之間的關係已經找到。

第三步:判斷初值

很明顯,當其中乙個序列為0時,dp=0恆成立。

因此dp[i][0] = 0(i from 0-i)、dp[0][j] = 0(j form 0-j);

至此,動態規劃最長公共子串行已經完成。

最長公共子串行**

int

lcs(string a,string b)

return dp[sizea]

[sizeb]

}

動態規劃之最長公共子串行(演算法導論)

1 一些概念 子串行 就是將原序列中的0個或多個元素去掉之後得到的序列。子串行不一定在原序列中連續。比如 x 中的乙個子串行可以為 也可以是 2 問題描述 現有兩個序列分別為 x 和y 求x和y的長度最大的公共子串行。3 問題解析 要尋找x和y的最長公共子串行,可以從前往後找,也可以從後向前找,若存...

最長公共子串 最長公共子串 動態規劃

有兩個字串 可能包含空格 請找出其中最長的公共連續子串,輸出其長度。長度在1000以內 例如 輸入 abcde bcd 輸出 3 1 把兩個字串分別以行和列組成乙個二維矩陣。2 比較二維矩陣中每個點對應行列字元中否相等,相等的話值設定為1,否則設定為0。3 通過查詢出值為1的最長對角線就能找到最長公...

《演算法導論》學習筆記 最長公共子串行(動態規劃)

給定兩個序列x x1,x 2,x3 xm和y y 1,y2 y3,yn,求x和y的最長公共子串行。例子 x a,b,c,b,d,a,b y b,d,c,a,b,a 最長公共子串行為b,c,b,a 注意 最長公共字串 longestcommonsubstring 要求元素必須連續,最長公共子串行不要求...