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

时间:2015-02-23 00:38:08

标签: python

写一个函数almostEqual来测试两个字符串是否几乎相等。当string1可以通过string2上的单个突变生成时,两个字符串string1和string2几乎相等。资金应该返回一个布尔值(真或假)。

"""Returns True if the two strings only differ by one character.
>>> nearlyEqual('python', 'perl')
False
>>> nearlyEqual('perl', 'pearl')
True
>>> nearlyEqual('python', 'jython')
True
>>> nearlyEqual('man', 'woman')
False
"""
def nearlyEqual(string1, string2):
  string1 = input('First Word')
  string2 = input('Second Word')
    if string1 == string2:
      print (True)
    else:
      print (False)
  return nearlyEqual(string1,string2)
  print (nearlyEqual(string1,string2))
string1 = ()
string2 = ()
print, nearlyEqual(string1, string2)

1 个答案:

答案 0 :(得分:8)

有趣的问题。一种自然的方法是使用完整的Levenshtein距离(AKA“编辑距离”)并确保它等于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

有趣的情况是,当差异恰好是一个 - 在这种情况下,你必须通过删除一个字符来检查是否可以将较长的字符串变成较短的字符串。

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

如果需要,我在这里交换字符串,以确保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

我将告诉您如何整理这些片段以使整体功能按预期工作 - 这样您就可以显示至少一些对Python的理解,因为您正在要求显示! - )