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

2021-09-29 21:09:13 字數 1584 閱讀 3599

演算法專題導航頁面

【題目描述】

給定兩個字串str1和str2,輸出兩個字串的最長公共子串,如果最長公共子串為空,輸出-1。

【輸入描述】

輸入包括兩行,第一行代表字串srr1,第二行代表字串str2。(1≤length(str1),length(str2)≤5000)

【輸出描述】

輸出包括一行,代表最長公共子串。

【示例1】

輸入1ab2345cd

12345ef

輸出2345

【備註】

時間複雜度o(n^2),額外空間複雜度o(1)。(n可以為其中任意乙個字串長度)

【**實現 - cpp版 - 經典動態規劃】

#include

#include

#include

using

namespace std;

/* * dp[i][j]表示以stra[i]和strb[j]結尾的字串的長度

* 第一種情況:stra[i] == strb[j] 公共字串存在,則有遞推公式: dp[i][j] = dp[i-1][j-1] + 1

* 第二種情況:stra[i] != strb[j] 公共字串不存在,則dp[i][j] = 0

*/void

dp_generator

(const string& stra,

const string& strb, vectorint>>

& dp)

}for

(int j=

0; jfor(

int i=

1; i}}

void

position_and_maxlen

(int

& endindex,

int& maxlen,

const vectorint>>

& dp)}}

}int

main()

【**實現 - cpp版 - 空間壓縮法】

#include

#include

using

namespace std;

void

position_and_maxlen_2

(const string& stra,

const string& strb,

int& maxlen,

int& endindex)

else

// 記錄當前斜線上的最大值,以及結束字元的位置

if(len > maxlen)

// 位置[i,j]計算完成,繼續想右下角遍歷

i++; j++;}

// 當前斜線處理完畢,遍歷其左側斜線

if(col >0)

else}}

intmain()

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

有兩個字串 可能包含空格 請找出其中最長的公共連續子串,輸出其長度。長度在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和...

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

問題描述 說明 求解兩個字串的最長公共子字串,必須連續 動態規劃求解步驟 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 ...