最长公共子序列 python

来源:互联网 发布:西门子usb编程电缆 编辑:程序博客网 时间:2024/05/19 02:25

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

实现下面的递推式,就实现了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


原创粉丝点击