返回错误答案的字谜代码

anagram code returning wrong answers

我写了一个简单的程序来测试两个单词是否是变位词(可以重新排列成另一个单词)。起初它似乎有效,当我测试非常不同的词时,比如 "julio" 和 "cesar"(这些是我的名字)并且它返回 "false",但后来我测试了不同的词只有一个字母,如 "julio" 和 "julis",但它返回 "true"。我想知道我做错了什么。提前致谢。 抱歉,标题不太具体,我不知道如何获得比这更具体的内容

PS: 代码写在python如果有帮助

import time, os

def detector():

    os.system('cls')
    input_1 = input("Enter the First word: \n")
    print("=" * 3 * len(input_1))
    input_2 = input("Enter the second word: \n")
    print("=" * 3 * len(input_1))

    win_index = 0

    input_1 = input_1.lower()
    input_2 = input_2.lower()

    if len(input_1) < len(input_2):
        print("This is not a anagram")
        return False
    else:
        print("\nLoading...\n")
        time.sleep(1)
        for i in range(len(input_1)):
            if input_1[letter_index] in input_2:
                letter_index += 1
                print("This is a anagram")
                return True
                break
            else:
                print("This is not a anagram")
                return False

detector()

你最大的问题在这里:

if input_1[letter_index] in input_2:
    letter_index += 1
    print("This is a anagram")
    return True
    break

一旦在 input_1 中的任何字母在 input_2 中找到,您将打印出 This is an anagram 然后 return True,而无需检查其余部分这些信。所以,juliojulis 匹配,因为 jjulis 中。事实上,jordanjulis 也匹配,因为 jjulis.

这里的正确逻辑是,如果在您检查了 所有 之后,none[=81,那么这些单词只是变位词=] 他们失败了。由于您将在第一次失败时进入 return False,因此您可以将其移至循环的末尾——唯一可以通过循环的方法就是不 return False

此外,letter_index 未在任何地方定义。您可能想使用 i?

所以,用这个替换你的循环:

for i in range(len(input_1)):
    if input_1[i] not in input_2:
        print("This is not a anagram")
        return False
print("This is an anagram")
return True

... 或者,更好:

for letter in input_1:
    if letter not in input_2:
        print("This is not a anagram")
        return False
print("This is an anagram")
return True

然而,这仍然不对。例如,考虑如果有重复的字母会怎样?

如果您检查 appleaple,它将通过。毕竟,apple 并不比 aple 短,而且 apple 中的每个字母也在 aple 中。要解决此问题,您需要将 < 检查替换为 != 检查:

if len(input_1) != len(input_2):

但这还是不对。如果您尝试 appleaplee 会怎样?它们的长度相同,apple 中的每个字母都在 aplee 中,但它们不是变位词。

解决此问题的唯一方法是确保您只使用 input_2 中的每个字母一次。

您可以通过在每次使用时删除一份 letter 来做到这一点:

for letter in input_1:
    if letter not in input_2:
        print("This is not a anagram")
        return False
    else:
        input_2 = input_2.replace(letter, '', 1)
print("This is an anagram")
return True

现在可以了。但它很笨重。如果你使用更好的数据结构会好很多,比如 Counter,它专为查找值和递减计数而设计:

from collections import Counter

counts = Counter(input_2)
for letter in input_1:
    if not counts[letter]:
        print("This is not an anagram")
        return False
    else:
        counts[letter] -= 1

但是一旦你使用了 Counter,你可以使这个更简单:

counts_1 = Counter(input_1)
counts_2 = Counter(input_2)
if counts_1 == counts_2:
    print("This is an anagram")
    return True
else:
    print("This is not an anagram")
    return False