問題描述:
說明:求解兩個字串的最長公共子字串,必須連續
動態規劃求解步驟
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 輸出描述 輸出包括一行,代表最長公共子串。示...