題目大意:
兩個字串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...