Skip to content

add Levinstein distance with Dynamic Programming: up -> down approach #7171

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Oct 30, 2022
55 changes: 55 additions & 0 deletions dynamic_programming/min_distance_up_bottom.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
"""
Author : Alexander Pantyukhin
Date : October 14, 2022
This is implementation Dynamic Programming up bottom approach
to find edit distance.
The aim is to demonstate up bottom approach for solving the task.
The implementation was tested on the
leetcode: https://leetcode.com/problems/edit-distance/
"""

"""
Levinstein distance
Dynamic Programming: up -> down.
"""


def min_distance_up_bottom(word1: str, word2: str) -> int:
"""
>>> min_distance_up_bottom("intention", "execution")
5
>>> min_distance_up_bottom("intention", "")
9
>>> min_distance_up_bottom("", "")
0
>>> min_distance_up_bottom("zooicoarchaeologist", "zoologist")
10
"""

from functools import lru_cache

len_word1 = len(word1)
len_word2 = len(word2)

@lru_cache(maxsize=None)
def min_distance(index1: int, index2: int) -> int:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file dynamic_programming/min_distance_up_bottom.py, please provide doctest for the function min_distance

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file dynamic_programming/min_distance_up_bottom.py, please provide doctest for the function min_distance

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file dynamic_programming/min_distance_up_bottom.py, please provide doctest for the function min_distance

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file dynamic_programming/min_distance_up_bottom.py, please provide doctest for the function min_distance

# if first word index is overflow - delete all from the second word
if index1 >= len_word1:
return len_word2 - index2
# if second word index is overflow - delete all from the first word
if index2 >= len_word2:
return len_word1 - index1
diff = int(word1[index1] != word2[index2]) # current letters not identical
return min(
1 + min_distance(index1 + 1, index2),
1 + min_distance(index1, index2 + 1),
diff + min_distance(index1 + 1, index2 + 1),
)

return min_distance(0, 0)


if __name__ == "__main__":
import doctest

doctest.testmod()