ctci/1. Arrays and strings/1.5. levenshtein.py

63 lines
1.6 KiB
Python

import unittest
def levenshtein(s1, s2):
if abs(len(s1) - len(s2)) > 1:
return False
if s1 == s2:
return True
len1 = len(s1)
len2 = len(s2)
flag = False
if len1 == len2: # equal lengths
for i in range(len1):
if s1[i] != s2[i]:
if flag:
return False
flag = True
return True
elif len1 < len2: # s1 shorter than s2
for i in range(len1):
if not flag:
if s1[i] != s2[i]:
if flag:
return False
flag = True
else: # there's already one difference
if s1[i] != s2[i + 1]:
return False
return True
elif len2 < len1: # s2 shorter than s1
for i in range(len2):
if not flag:
if s1[i] != s2[i]:
if flag:
return False
flag = True
else: # there's already one difference
if s1[i + 1] != s2[i]:
return False
return True
class Test(unittest.TestCase):
dataT = [("", ""), ("an", "a"), ("a", "an"), ("ane", "ae"),
("ane", "ne"), ("asdfgh", "asdgh"), ("asdf", "asgf")]
dataF = [("asdfg", "adfgh"), ("an", "ne"), ("asdf", "as")]
def test_unique(self):
for test in self.dataT:
res = levenshtein(*test)
self.assertTrue(res)
for test in self.dataF:
res = levenshtein(*test)
self.assertFalse(res)
return
if __name__ == "__main__":
unittest.main()