問題描述: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演算法效能分析:這個演算法主要做的事情是,建立最長公共子串表,然後遍歷這個表。表的建立需要乙個乙個填寫表項,因此複雜度為o(mn)。//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
補充一下,之前一直沒有考慮最長公共子串不唯一的問題。我們的演算法的確能夠找到乙個最長公共子串,但是如果要把所有的串輸出,在步驟二中必須分情況討論,把中間結果壓棧,具體細節有空再補充。
最長公共子串 最長公共子串 動態規劃
有兩個字串 可能包含空格 請找出其中最長的公共連續子串,輸出其長度。長度在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 也是乙個有效答案。思想 動態規劃 步驟 第一步 確定子問題。在這一步重點是分析那些變數是隨著問題規模的變小而變小的,那些變數與問題的規模無關。第二步 確定狀態...