我们在求最长公共子序列时一般方法是c(i,j) = c(i-1,j-1) if s1[i] = s2[j] or max(c[i-1][j],c[i][j-1]) if s1[i] != s2[j].
这样,空间复杂度是o(M*N),对此,我们可以做一下优化:
注意到,在求c(i,j)时,只用到了c(i-1,j)和c(i,j-1),所以可以用滚动数组来优化,具体实现又极其简单:
对于s1[N]和s2[M]
开数组 table[2][M];
for(int i=0;i<N;i++){
for(int j=0;j<M;j++)
if(s1[i]==s2[j])
table[now][j+1] = table[!now][j]+1;
else
table[now][j+1] = max(table[now][j],table[!now][j+1]);
now = !now;
}
而table[!now][M]就是最终的结果。
例如:
s1[5] = { a,b,c,d,e }
s2[5] = { b,d,a,a,a }
table[now][2] = max(table[!now][j+1](s1到a(s1[0]),s2到d(s2[1])),table[now][j](s1到b(s1[1]),s2到b(s2[1]))