演算法專題導航頁面
【題目描述】
給定兩個字串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 ...