問題:
給出兩個字串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 ...