最长公共子序列 python

注意:子序列和子串的区别,前者是字符串里的不相隔的字符组成的串,字符的先后顺序不变;后者是连续的字符组成的字符串

实现下面的递推式,就实现了dp动归。更多图解的过程,可以参看博客http://blog.csdn.net/hrn1216/article/details/51534607




class LCS:
    def findLCS(self, A, n, B, m):
        if m == 0 or n == 0:
            return -1
        c = [[0 for _ in xrange(m + 1)] for _ in range(n + 1)]
        for i in range(1, n + 1):
            for j in range(1, m + 1):
                if A[i - 1] == B[j - 1]:
                    c[i][j] = c[i - 1][j - 1] + 1
                else:
                    c[i][j] = max(c[i][j - 1], c[i - 1][j])
        return c[-1][-1]

if __name__ == '__main__':
    line = raw_input().split(',')
    A = line[0][1:-1]
    n = int(line[1])
    B = line[2][1:-1]
    m = int(line[-1])
    print LCS().findLCS(A, n, B, m)


以上的代码中,如果将 c的定义改成 c=[[0 for _ in range(m + 1)]]*(n+1)  结果始终不对,为什么?这里需要明白二者的区别,这是个大坑,如下图


后面一种方式定义的是一种引用,修改其中一个,其他的也会发生变化


参考文献

http://blog.csdn.net/hrn1216/article/details/51534607

http://www.cnblogs.com/zfyouxi/p/4195215.html


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值