Problem Statement
Given two string s1 and s2. Find the longest common subsequence between s1 and s2.
Link@HackerRank: The Longest Common Subsequence
def longest_common_subsequence(s1, s2):
"""Find the longest common subsequence between s1 and s2.
"""
# Corner cases.
if not s1 or not s2:
return None
# DP.
n, m = len(s1), len(s2)
dp = [[0 for i in xrange(m + 1)] for j in xrange(n + 1)]
for i in xrange(1, n + 1):
for j in xrange(1, m + 1):
if s1[i - 1] == s2[j - 1]:
dp[i][j] = 1 + dp[i - 1][j - 1]
else:
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
# Construct the longest common subsequence.
lcs = []
i, j = n, m
while i and j:
if s1[i - 1] == s2[j - 1]:
lcs.append(s1[i - 1])
i -= 1
j -= 1
elif dp[i][j] == dp[i - 1][j]:
i -= 1
else:
j -= 1
lcs.reverse()
return "".join(lcs)
Analysis: O(n2) time complexity, O(n2) space complexity.