diff --git a/dynamic_programming/longest common subsequence.py b/dynamic_programming/longest common subsequence.py index f722c5d12..da95561ed 100644 --- a/dynamic_programming/longest common subsequence.py +++ b/dynamic_programming/longest common subsequence.py @@ -3,16 +3,46 @@ LCS Problem Statement: Given two sequences, find the length of longest subsequen A subsequence is a sequence that appears in the same relative order, but not necessarily continious. Example:"abc", "abg" are subsequences of "abcdefgh". """ -def LCS(s1, s2): - m = len(s1) - n = len(s2) +def LCS(x,y): + b=[[] for j in range(len(x)+1)] + c=[[] for i in range(len(x))] + for i in range(len(x)+1): + b[i].append(0) + for i in range(1,len(y)+1): + b[0].append(0) + for i in range(len(x)): + for j in range(len(y)): + if x[i]==y[j]: + b[i+1].append(b[i][j]+1) + c[i].append('/') + elif b[i][j+1]>=b[i+1][j]: + b[i+1].append(b[i][j+1]) + c[i].append('|') + else : + b[i+1].append(b[i+1][j]) + c[i].append('-') + return b,c - arr = [[0 for i in range(n+1)]for j in range(m+1)] - for i in range(1,m+1): - for j in range(1,n+1): - if s1[i-1] == s2[j-1]: - arr[i][j] = arr[i-1][j-1]+1 - else: - arr[i][j] = max(arr[i-1][j], arr[i][j-1]) - return arr[m][n] +def print_lcs(x,c,n,m): + n,m=n-1,m-1 + ans=[] + while n>=0 and m>=0: + if c[n][m]=='/': + ans.append(x[n]) + n,m=n-1,m-1 + elif c[n][m]=='|': + n=n-1 + else: + m=m-1 + ans=ans[::-1] + return ans + + +if __name__=='__main__': + x=['a','b','c','b','d','a','b'] + y=['b','d','c','a','b','a'] + b,c=LCS(x,y) + print('Given \nX : ',x) + print('Y : ',y) + print('LCS : ',print_lcs(x,c,len(x),len(y)))