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

2021-10-01 07:43:18 字數 2160 閱讀 2047

問題描述:

說明:求解兩個字串的最長公共子字串,必須連續

動態規劃求解步驟

step 1: 分析最優解的性質,刻畫其結構特徵

step 2: 遞迴地定義最優解

僅當x[i]=y[j]時,d[i,j]=d[i-1,j-1]+1;即當且僅當字串x[i]=y[j]時x[i],y[j]的最長公共子字串長度d[i,j]

x[i-1],y[j-1]的最長公共子串行長度d[i-1,j-1]

進行加1

其他情況時d[i,j]=0

step 3: 自底向上計算子問題的最優解

構建儲存單元:

二維陣列d[m,n]:記錄最長公共字串的長度;

l: 用來記錄最長公共字串的長度;

p: 記錄最長公共字串最後乙個元素在x中的位置

step 4: 構造問題的最優解 

最終求得的最優解為字串x[p-l+1,p]的一段字串

偽**解析

1.求解最長公共子字串

longest-common-substring(x, y)

輸入 x、y:待求解最長公共字串的的兩個字串序列

輸出 最長公共子串行,以及子串行長度

input: two strings ?, ?.

output: longest common substring of ? and ?.

? ← length(?);

? ← length(?);

步驟1:構建乙個二維陣列d[m,n]記錄最長公共字串的長度

let ?[0. . ?, 0. . ?] be two new 2-dimension arrays;

? ← 0; #? 記錄最長公共字串長度

? ← 0; #? 記錄最長公共字串在序列x的位置

步驟2:將二維陣列d[m,n]第一列,第一行置為0,即任何長度字串與空字串的最長公共子字串的長度均為0

for ? ← 0 ?? ? do

? [?, 0] ← 0;

endfor ? ← 0 ?? ? do

? [0, ?] ← 0;

end步驟3:兩層迴圈按行逐個遍歷二維陣列d[m,n]中的每個位置

for ? ← 1 ?? ? do

for ? ← 1 ?? ? do

if x[i] ≠ ?[j] then

? [?, ?] ← 0

endelse

? [?, ?] ← ? [? − 1, ? − 1] + 1;

if ?[?, ?] > ? then

? ← ? [?, ?] ;

? ← ?;

endend

endendreturn ?, ?;

2.輸出最長子序列

print-lcsubstring(x, ?, ?)

input: strings ?, ???? and ???? are generated from longest-common-substring.

output: output the longest common substring of ?[1. . ?] and ?[?. . ?].

步驟1:判斷求解最終是否具有公共子字串

if ? ?? ????? ?? 0 then

return null

end步驟2:由於求解的是連續子字串,可以直接計算得到公共子字串在x中的起始位置p-l+1,結束位置為p,

通過迴圈遍歷輸出即可

for ? ← (? − ? + 1) ?? ? do

print x[i];

end

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

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

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

時間限制 3秒 空間限制 32768k 對於兩個字串,請設計乙個時間複雜度為o m n 的演算法 這裡的m和n為兩串的長度 求出兩串的最長公共子串的長度。這裡的最長公共子串的定義為兩個序列u1,u2,un和v1,v2,vn,其中ui 1 ui 1,vi 1 vi 1,同時ui vi。給定兩個字串a和...

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

演算法專題導航頁面 題目描述 給定兩個字串str1和str2,輸出兩個字串的最長公共子串,如果最長公共子串為空,輸出 1。輸入描述 輸入包括兩行,第一行代表字串srr1,第二行代表字串str2。1 length str1 length str2 5000 輸出描述 輸出包括一行,代表最長公共子串。示...