最長公共子串行LCS C 題解

2021-10-23 07:00:05 字數 1396 閱讀 5646

題目大意:

兩個字串a和b,需要統計出其中公共子串行的最長是多少。

注意:所謂子串行,指的是出現的先後順序一樣,但可以不連續出現。比如對於s=abdef,其中adf是s 的乙個子串行,因為對於adf中每個字元,其出現的先後順序與s中先後順序一致。

最長公共子串行(longest common subsequence,lcs)這是一道dp題

狀態表示f(i,j) 表示 字串a中(a1~ai)個字元與 字串b中( b1 ~bj)個字元中公共子串行的最大值。

按照ai和bj是否相等來分,

如果相等,最後一位必然是相同的,

這樣的話,也就是在a1~ai-1中選,和在b1 ~ bj-1中選,組成公共子串行的最大值,然後加1即可,即f(i-1,j-1)+1

如果最後一位不等,必然有乙個多餘

表示01=不包含ai,但是包含bj

10=包含ai,但是不包含bj

對於01,也就是在a1~ai-1中選,和在b1 ~ bj中選,組成公共子串行的最大值,f(i-1,j)

對於10,也就是在a1~ai中選,和在b1 ~ bj-1中選,組成公共子串行的最大值,即f(i,j-1)

最後f(i,j)就與三種狀態有關:f(i

−1,j

−1),

f(i−

1,j)

,f(i

,j−1

)f(i-1,j-1), f(i-1,j), f(i,j-1)

f(i−1,

j−1)

,f(i

−1,j

),f(

i,j−

1),

f[i][j]=max(f[i-1][j],f[i][j-1]);//01和10狀態必有,選擇最大的

if(a[i]==b[j]) //

f[i][j]=max(f[i][j],f[i-1][j-1]+1);

最後的答案

f[n][m],n是字串a的長度,m是字串b的長度

acwing897. 最長公共子串行

acwing ac**

時間複雜度o(n

2)

o(n^2)

o(n2

)

#include#include#includeusing namespace std;

const int maxn=1010;

char a[maxn],b[maxn];

int n,m;

int f[maxn][maxn];//f[i][j]表示a1-ai中和b1-bj中公共子串行的最長長度

int main()

}cout

}

最長公共子串行LCS C 實現

與之前c語言版本相比主要是使用了stl容器.另外下標的計算方式也有改動 記錄表c 矩陣 中第0行和第0列都初始化為0作為輔助.因此第i行對應的是字串x的第i 1個元素,與原圖對比即明白 由於string模板的限制,字串從0下標開始,因此x 0 對應矩陣第1行.明白這點,y亦同理.include in...

題解 最長公共子串行

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

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...