mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-27 15:01:08 +00:00
Update longest common subsequence.py
This commit is contained in:
parent
0e857d8905
commit
aae156252f
|
@ -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)))
|
||||
|
|
Loading…
Reference in New Issue
Block a user