題解 AcWing 897 最長公共子串行

2022-07-06 13:54:11 字數 1434 閱讀 4244

給定兩個長度分別為n和m的字串a和b,

求既是a的子串行又是b的子串行的字串長度最長是多少。

輸入格式

第一行包含兩個整數n和m。

第二行包含乙個長度為n的字串,表示字串a。

第三行包含乙個長度為m的字串,表示字串b。

字串均由小寫字母構成。

輸出格式

輸出乙個整數,表示最大長度。

資料範圍

\(1≤n,m≤1000\)

輸入樣例:

4 5

acbd

abedc

輸出樣例:
3
(動態規劃) \(o(n^2)\)

狀態表示

考慮用二維來表示整個集合

f[i][j]表示在第乙個字串s1中的前i個字母

與第二個字串s2中的前j個字母的最長公共子串行

狀態計算

我們可以把f[i][j]分為四種情況:

i和j都不選,即 0 0

i選、j不選,即 1 0

i不選、j選,即 0 1

i選、j也選,即 1 1

第一種情況 很容易得出f[i][j] = f[i-1][j-1]

第二種情況 用f[i][j] = f[i][j-1]

f[i][j-1] 實際上不一定選擇了i,它是選i與不選i兩種情況的集合,然而不選i的情況 其實就是第乙個情況,它也是f[i][j]的最大值的結果的集合的乙個子集,和第三種情況一起重複但是不漏不影響最大值的值。

因為 求 a, b, c 的最大值 等價於 求 a和b的最大值 與 b和c的最大值 的最大值。

第三種情況 與第二種類似

第四種情況 我個人理解是就是選i和j了

如下面這個例子

abc

acc

最長公共子串行是ac,我們既可以看成首尾的a和c,也可以看成是ac然後最後乙個沒用

在這種情況下,如果i與j都選的話,我們看成選s1[i]和s2[j] 和 在i和j前面是否有與它們相同的單個字母的情況是等價的

時間複雜度

兩重迴圈

\(o(n^2)\)

c++ **

#include #include using namespace std;

const int n = 1010;

int len1, len2;

int f[n][n];

char s1[n], s2[n];

int main()

cout << f[len1][len2] << endl;

return 0;

}

acwing 897 最長公共子串行

給定兩個長度分別為 n 和 m 的字串 a 和 b,求既是 a 的子串行又是 b 的子串行的字串長度最長是多少。輸入格式 第一行包含兩個整數 n 和 m。第二行包含乙個長度為 n 的字串,表示字串 a。第三行包含乙個長度為 m 的字串,表示字串 b。字串均由小寫字母構成。輸出格式 輸出乙個整數,表示...

acwing 897最長公共子串行(線性dp)

題目鏈結 給定兩個長度分別為n和m的字串a和b,求既是a的子串行又是b的子串行的字串長度最長是多少。輸入格式 第一行包含兩個整數n和m。第二行包含乙個長度為n的字串,表示字串a。第三行包含乙個長度為m的字串,表示字串b。字串均由小寫字母構成。輸出格式 輸出乙個整數,表示最大長度。資料範圍 1 n 1...

題解 最長公共子串行

描述 乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列。確切地說,若給定序列x 則另一串行z 是x的子串行是指存在乙個嚴格遞增的下標序列,使得對於所有j 1,2,k有 xij zjx z jxij zj 例如,序列z 是序列x 的子串行,相應的遞增下標序列為 2,3,5,7 給定兩個序列x和...