Skip to content

Commit

Permalink
Add Edit Distance algorithm with tests
Browse files Browse the repository at this point in the history
  • Loading branch information
staging-devin-ai-integration[bot] committed Aug 23, 2024
1 parent 1ee7c81 commit adb15d9
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 0 deletions.
37 changes: 37 additions & 0 deletions dp/edit_distance.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
def edit_distance(str1, str2):
"""
Calculate the minimum number of operations required to convert str1 into str2.
Operations allowed: insertion, deletion, substitution.
:param str1: First string
:param str2: Second string
:return: Minimum number of operations required
"""
m, n = len(str1), len(str2)

# Create a matrix to store the subproblem solutions
dp = [[0] * (n + 1) for _ in range(m + 1)]

# Initialize the first row and column
for i in range(m + 1):
dp[i][0] = i
for j in range(n + 1):
dp[0][j] = j

# Fill the dp matrix
for i in range(1, m + 1):
for j in range(1, n + 1):
if str1[i-1] == str2[j-1]:
dp[i][j] = dp[i-1][j-1]
else:
dp[i][j] = 1 + min(dp[i-1][j], # deletion
dp[i][j-1], # insertion
dp[i-1][j-1]) # substitution

return dp[m][n]

# Example usage
if __name__ == "__main__":
str1 = "kitten"
str2 = "sitting"
print(f"Edit distance between '{str1}' and '{str2}': {edit_distance(str1, str2)}")
26 changes: 26 additions & 0 deletions dp/test_edit_distance.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import unittest
from edit_distance import edit_distance

class TestEditDistance(unittest.TestCase):
def test_basic_cases(self):
self.assertEqual(edit_distance("kitten", "sitting"), 3)
self.assertEqual(edit_distance("horse", "ros"), 3)
self.assertEqual(edit_distance("intention", "execution"), 5)

def test_edge_cases(self):
self.assertEqual(edit_distance("", ""), 0)
self.assertEqual(edit_distance("", "abc"), 3)
self.assertEqual(edit_distance("abc", ""), 3)
self.assertEqual(edit_distance("abc", "abc"), 0)

def test_single_character_operations(self):
self.assertEqual(edit_distance("a", "b"), 1) # substitution
self.assertEqual(edit_distance("a", "ab"), 1) # insertion
self.assertEqual(edit_distance("ab", "a"), 1) # deletion

def test_long_strings(self):
self.assertEqual(edit_distance("pneumonoultramicroscopicsilicovolcanoconiosis",
"ultramicroscopically"), 27)

if __name__ == '__main__':
unittest.main()

0 comments on commit adb15d9

Please sign in to comment.