mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-27 15:01:08 +00:00
Edit Distance Algorithm for String Matching (#10571)
* Edit Distance Algorithm for String Matching * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Apply suggestions from code review * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update edit_distance.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: Tianyi Zheng <tianyizheng02@gmail.com>
This commit is contained in:
parent
b301e589e2
commit
33888646af
32
strings/edit_distance.py
Normal file
32
strings/edit_distance.py
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
def edit_distance(source: str, target: str) -> int:
|
||||||
|
"""
|
||||||
|
Edit distance algorithm is a string metric, i.e., it is a way of quantifying how
|
||||||
|
dissimilar two strings are to one another. It is measured by counting the minimum
|
||||||
|
number of operations required to transform one string into another.
|
||||||
|
|
||||||
|
This implementation assumes that the cost of operations (insertion, deletion and
|
||||||
|
substitution) is always 1
|
||||||
|
|
||||||
|
Args:
|
||||||
|
source: the initial string with respect to which we are calculating the edit
|
||||||
|
distance for the target
|
||||||
|
target: the target string, formed after performing n operations on the source string
|
||||||
|
|
||||||
|
>>> edit_distance("GATTIC", "GALTIC")
|
||||||
|
1
|
||||||
|
"""
|
||||||
|
if len(source) == 0:
|
||||||
|
return len(target)
|
||||||
|
elif len(target) == 0:
|
||||||
|
return len(source)
|
||||||
|
|
||||||
|
delta = int(source[-1] != target[-1]) # Substitution
|
||||||
|
return min(
|
||||||
|
edit_distance(source[:-1], target[:-1]) + delta,
|
||||||
|
edit_distance(source, target[:-1]) + 1,
|
||||||
|
edit_distance(source[:-1], target) + 1,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print(edit_distance("ATCGCTG", "TAGCTAA")) # Answer is 4
|
Loading…
Reference in New Issue
Block a user