1. 程式人生 > >最長公共子序列 python

最長公共子序列 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