diff --git a/dp/edit_distance.py b/dp/edit_distance.py new file mode 100644 index 0000000..83b99a7 --- /dev/null +++ b/dp/edit_distance.py @@ -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)}") diff --git a/dp/test_edit_distance.py b/dp/test_edit_distance.py new file mode 100644 index 0000000..7411a21 --- /dev/null +++ b/dp/test_edit_distance.py @@ -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()