求最长公共子序列的空间优化。

我们在求最长公共子序列时一般方法是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]))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值