演算法作業6 動態規劃 最長公共子串問題

2022-08-29 20:51:28 字數 2279 閱讀 5491

問題描述:given 2 sequences, x = x1,...,xm and y = y1,...,yn, find a common subsequence whose length is maximum. subsequence need not be consecutive, but must be in order.

程式思路:

使用遞迴的思路可以解決這個問題。設輸入的兩個子串為x[0…m - 1]和y[0…n - 1],l(x[0…m - 1], y[0…n - 1])為x和y的最長公共子串長度。分兩種情況:

1. 若子串最後乙個字元匹配(即x[m – 1] == y[n – 1]),則

l(x[0…m - 1], y[0…n - 1])= 1 + l(x[0…m - 2], y[0…n - 2])

2. 若子串最後乙個字元不匹配(即x[m – 1] != y[n – 1]),則

l(x[0…m - 1], y[0…n - 1]) = max( l(x[0…m - 2], y[0…n - 1]), l(x[0…m - 1], y[0…n - 2]))

但是遞迴的情況下,很多子情況會重複計算多次,因此可以使用動態規劃來優化,這裡可以使用畫**的方法來記錄下子問題的解,供後面計算使用。這裡的**記錄最長公共子串的長度。

例如:」abcfgr」 和」ackwgr」的最長公共子串表為

右下角的值就是兩個子串的最長公共子串長度。

如果需要輸出兩個子串的最長公共子串,則需要額外的空間把每個字元存起來。步驟如下:

構造最長公共子串長度表l;

構造乙個長為l[m][n]的string s;

從l[m][n]這個位置開始遍歷l,直到m或者n為0,對於l中的每個元素l[i][j],

a)    若x[i - 1] == y[j - 1],即這個字元是最長公共子串的乙個字元,放在s的末尾,往左上方移動一格,即i – 1,j – 1,繼續遍歷。

b)    若不等,則在**左邊或者上方選擇乙個較大值,移動一格,即i – 1或者j – 1,繼續遍歷。

根據上面的例子,給出遍歷路徑:

所以」abcfgr」 和」ackwgr」的最長公共子串為」acgr」。

演算法偽**:

1

//lcs演算法2//

輸入:子串x,子串y,x的長度m,y的長度n3//

輸出:最長公共子串

4lcs(x, y, m, n)

5begin

6 create l[m + 1][n + 1]7

for each i from

0 to m do

8for each j from

0 to n do

9if i == 0 or j == 0

10 l[i][j] = 0

11 else if x[i – 1] == y[j – 1

]12 l[i][j] = l[i – 1][j – 1] + 1

13else

14 l[i][j] = max(l[i – 1][j], l[i][j – 1

])15 create char

c[l[m][n]]

16 for l[m][n] to l[0][p] or l[q][0

]17 if x[i - 1] == y[j – 1

]18 push this

char

to c

19skip to left up

20else

21 skip to left or up which is

larger

22 end

演算法效能分析:這個演算法主要做的事情是,建立最長公共子串表,然後遍歷這個表。表的建立需要乙個乙個填寫表項,因此複雜度為o(mn)。

補充一下,之前一直沒有考慮最長公共子串不唯一的問題。我們的演算法的確能夠找到乙個最長公共子串,但是如果要把所有的串輸出,在步驟二中必須分情況討論,把中間結果壓棧,具體細節有空再補充。

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

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

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

描述 計算兩個字串的最大公共子串 longest common substring 的長度,字元不區分大小寫。輸入 輸入兩個字串 輸出 輸出乙個整數 樣例輸入 asdfas werasdfaswer樣例輸出 6 參考 這裡的最大公共字串要求的字串是連續的。求字串的方法和求子序列方法類似 當s i t...

最長公共子串 動態規劃

題目 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。示例 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。思想 動態規劃 步驟 第一步 確定子問題。在這一步重點是分析那些變數是隨著問題規模的變小而變小的,那些變數與問題的規模無關。第二步 確定狀態...