最長公共子串行問題(動態規劃演算法)

2021-06-20 04:22:13 字數 1873 閱讀 7061

問題:

給出兩個字串a:a1

a2a3

…an和b:b1

b2b3

…bm,求a和b的最長公共子串行的長度。例如

a = xyxxzxyzxy,b = zxzyyzxxyxxz,則它們的最長公共子串行為xy***z,長度為6。

注意:

最長公共子串行不一定要求連續的字串,只講究先後順序一致。

約定:

l[i, j]表示這樣兩個字串的最長公共子串行的長度:a (a1

a2a3

…ai)和b (b1

b2b3

…bj)

核心思想:

如果ai = bj,則l[i, j] = l[i-1, j-1] + 1;

如果ai

≠bj,則l[i,j] = max 。

實現:

採用乙個二維陣列,逐行計算l[1, 1],l[1, 2],l[1, 3],… ,l[1, n],… ,l[2, 1],… ,l[n, 1],… ,l[n, m],並將結果儲存到二維陣列中。

核心演算法:

for i = 1 to n

for j = 1 to m

if ai

= bj

then l[i, j] = l[i-1, j-1] + 1

else l[i, j] = max

end if

end for

end for

時間複雜度:

由於有兩層for迴圈,分別迴圈了n次和m次,故時間複雜度為:θ(mn)。

示例:a =xyxxzxyzxy,b = zxzyyzxxyxxz

a: 序號12

3456

78910

字元xyx

xzxy

zxyb:

序號123

4567

891011

12字元zx

zyyz

xxyx

xz使用迴圈逐行填表:

0(null)

1 (z)

2 (x)

3 (z)

4 (y)

5 (y)

6 (z)

7 (x)

8 (x)

9 (y)

10 (x)

11 (x)

12 (z)

0(null)00

0000

0000

0001 (x)00

1111

1111

1112 (y)00

1122

2222

2223 (x)00

1122

2333

3334 (x)00

1122

2344

4445 (z)01

1222

3344

4456 (x)01

2222

3444

5557 (y)01

2233

3445

5558 (z)01

2333

4445

5569 (x)01

2333

4555

66610 (y)01

2344

4556

666最後,字串a和字串b的最長公共子串行的長度是6。

應用領域:

簡單文字相似度分析、文字去重等。

動態規劃演算法之最長公共子串行問題

問題描述 給定兩個字串,尋找這兩個字串之間的最長公共子串行。輸入格式 輸入兩行,分別包含乙個字串,僅含有小寫字母。輸出格式 最長公共子串行的長度。樣例輸入 abcdgh aedfhb 樣例輸出 3樣例說明 最長公共子串行為a,d,h。資料規模和約定 字串長度1 1000。分析 求最長公共子串行,用動...

以最長公共子串行問題理解動態規劃演算法(DP)

動態規劃方法通常用於求解最優化問題。我們希望找到乙個解使其取得最優值,而不是所有最優解,可能有多個解都達到最優值。如何判斷乙個問題是不是dp問題呢?適合dp求解的最優化問題通常具有以下兩個特徵 下面以力扣的1143題最長公共子串行為例講解dp問題的求解思路。乙個簡單暴力的演算法是窮舉出兩個字串的所有...

動態規劃演算法 最短編輯距離與最長公共子串行

參考 一 先談最短編輯距離 問題描述 編輯距離 edit distance 又稱levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個 字元替換 成另乙個字元,插入乙個字元,刪除乙個字元。例如將kitten一字轉成sitting sitten ...