mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-12-05 02:40:16 +00:00
895dffb412
* [pre-commit.ci] pre-commit autoupdate updates: - [github.com/astral-sh/ruff-pre-commit: v0.0.291 → v0.0.292](https://github.com/astral-sh/ruff-pre-commit/compare/v0.0.291...v0.0.292) - [github.com/codespell-project/codespell: v2.2.5 → v2.2.6](https://github.com/codespell-project/codespell/compare/v2.2.5...v2.2.6) - [github.com/tox-dev/pyproject-fmt: 1.1.0 → 1.2.0](https://github.com/tox-dev/pyproject-fmt/compare/1.1.0...1.2.0) * updating DIRECTORY.md * Fix typos in test_min_spanning_tree_prim.py * Fix typos * codespell --ignore-words-list=manuel --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Co-authored-by: Tianyi Zheng <tianyizheng02@gmail.com> Co-authored-by: Christian Clauss <cclauss@me.com>
50 lines
1.4 KiB
Python
50 lines
1.4 KiB
Python
"""
|
|
Author : Alexander Pantyukhin
|
|
Date : October 14, 2022
|
|
This is an implementation of the up-bottom approach to find edit distance.
|
|
The implementation was tested on Leetcode: https://leetcode.com/problems/edit-distance/
|
|
|
|
Levinstein distance
|
|
Dynamic Programming: up -> down.
|
|
"""
|
|
|
|
import functools
|
|
|
|
|
|
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
|
|
"""
|
|
len_word1 = len(word1)
|
|
len_word2 = len(word2)
|
|
|
|
@functools.cache
|
|
def min_distance(index1: int, index2: int) -> int:
|
|
# if first word index overflows - delete all from the second word
|
|
if index1 >= len_word1:
|
|
return len_word2 - index2
|
|
# if second word index overflows - 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()
|