63 lines
1.6 KiB
Python
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()
|