Python 如果两个字符串仅相差一个字符,则返回True

Python 如果两个字符串仅相差一个字符,则返回True,python,Python,写一个函数nearlyEqual来测试两个字符串是否几乎相等。当string1可以由string2上的单个突变生成时,string1和string2两个字符串几乎相等。基础应返回布尔值(True或False) 有趣的问题。一种自然的方法是使用成熟的Levenshtein距离(也称为“编辑距离”),并确保它等于1。但是,对于1的特殊情况,您可以做得更好 如果两个字符串的长度相同,您显然需要检查它们是否仅在一个点上不同…: if len(string1) == len(string2): c

写一个函数nearlyEqual来测试两个字符串是否几乎相等。当string1可以由string2上的单个突变生成时,string1和string2两个字符串几乎相等。基础应返回布尔值(True或False)


有趣的问题。一种自然的方法是使用成熟的Levenshtein距离(也称为“编辑距离”),并确保它等于1。但是,对于
1
的特殊情况,您可以做得更好

如果两个字符串的长度相同,您显然需要检查它们是否仅在一个点上不同…:

if len(string1) == len(string2):
    count_diffs = 0
    for a, b in zip(string1, string2):
        if a!=b:
            if count_diffs: return False
            count_diffs += 1
    return True
如果长度差大于1,则结果显然是
False

有趣的情况是,当差异正好为1时——在这种情况下,您必须检查是否可以通过删除正好一个字符将较长的字符串转换为较短的字符串

if abs(len(string1) - len(string2)) > 1: return False
if len(string1) < len(string2):
    string1, string2 = string2, string1

我将让您决定如何将这些代码片段组合在一起,以使整个函数按预期工作——这样您就可以在被要求显示的情况下,至少显示出对Python的一些理解!)

你的问题是什么?
if abs(len(string1) - len(string2)) > 1: return False
if len(string1) < len(string2):
    string1, string2 = string2, string1
it1 = iter(string1)
it2 = iter(string2)
count_diffs = 0
c1 = next(it1, None)
c2 = next(it2, None)
while True:
    if c1 != c2:
        if count_diffs: return False
        count_diffs = 1
        c1 = next(it1)
    else:
        try:
            c1 = next(it1)
            c2 = next(it2)
        except StopIteration: return True