03
Sequence Alignment
Chapter 3 • Advanced
120 min
Sequence Alignment
Edit Distance (Levenshtein Distance)
Minimum operations to transform string1 to string2.
Operations: insert, delete, replace.
DP Solution
python.js
def edit_distance(s1, s2):
"""
Edit distance using DP.
Time: O(m * n), Space: O(m * n)
"""
m, n = len(s1), len(s2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
# Base cases
for i in range(m + 1):
dp[i][0] = i # Delete all
for j in range(n + 1):
dp[0][j] = j # Insert all
# Fill table
for i in range(1, m + 1):
for j in range(1, n + 1):
if s1[i-1] == s2[j-1]:
dp[i][j] = dp[i-1][j-1] # Match
else:
dp[i][j] = 1 + min(
dp[i-1][j], # Delete
dp[i][j-1], # Insert
dp[i-1][j-1] # Replace
)
return dp[m][n]
Longest Common Subsequence (LCS)
python.js
def lcs(s1, s2):
"""
Longest Common Subsequence.
Time: O(m * n), Space: O(m * n)
"""
m, n = len(s1), len(s2)
dp = [[0] * (n + 1) for _ 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]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
return dp[m][n]
Longest Common Substring
python.js
def lc_substring(s1, s2):
"""Longest Common Substring"""
m, n = len(s1), len(s2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
max_len = 0
for i in range(1, m + 1):
for j in range(1, n + 1):
if s1[i-1] == s2[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
max_len = max(max_len, dp[i][j])
else:
dp[i][j] = 0
return max_len
Practice Problems
- Edit distance
- Longest common subsequence
- Longest common substring
- Minimum ASCII delete sum
- Distinct subsequences