''' mbinary ######################################################################### # File : lcs.py # Author: mbinary # Mail: zhuheqin1@gmail.com # Blog: https://mbinary.xyz # Github: https://github.com/mbinary # Created Time: 2018-08-25 12:00 # Description: ######################################################################### ''' def lcs(a, b): '''time: O(mn); space: O(mn)''' m, n = len(a), len(b) board = [[[] for i in range(n+1)] for i in range(m+1)] for i in range(m): for j in range(n): if a[i] == b[j]: board[i+1][j+1] = board[i][j]+[a[i]] elif len(board[i][j+1]) < len(board[i+1][j]): board[i+1][j+1] = board[i+1][j] else: board[i+1][j+1] = board[i][1+j] return board[m][n] def lcs2(a, b): '''time: O(mn); space: O(m)''' m, n = len(a), len(b) board = [[] for i in range(n+1)] for i in range(m): upperLevel = board[0].copy() for j in range(n): tmp = board[j+1].copy() if a[i] == b[j]: board[j+1] = upperLevel+[a[i]] elif len(board[j+1]) < len(board[j]): board[j+1] = board[j].copy() # copy is needed upperLevel = tmp return board[n] if __name__ == '__main__': a = 'ABCBDAB' b = 'BDCABA' print('s1:', a) print('s2:', b) while 1: print('lcs:', lcs2(a, b)) a = input('s1: ') b = input('s2: ')