mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-23 21:11:08 +00:00
add Levinstein distance with Dynamic Programming: up -> down approach (#7171)
* add Levinstein distance with Dynamic Programming: up -> down approach * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * add type hint * fix flake8 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update dynamic_programming/min_distance_up_bottom.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update min_distance_up_bottom.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Christian Clauss <cclauss@me.com>
This commit is contained in:
parent
2c65597093
commit
cf915e7042
55
dynamic_programming/min_distance_up_bottom.py
Normal file
55
dynamic_programming/min_distance_up_bottom.py
Normal file
|
@ -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:
|
||||
# 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()
|
Loading…
Reference in New Issue
Block a user