有趣的问题。一种自然的方法是使用成熟的 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
如果需要的话,我在这里交换字符串,以确保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
我将让您自行决定如何将这些片段组合在一起以使整体功能按预期工作——这样您至少可以展示some正如要求您展示的那样,您对 Python 的理解!-)