Anagram 函数在某些单词中因未知原因返回 False - Python

问题描述 投票:0回答:3

我尝试创建一个函数,如果两个单词是彼此的字谜(具有相同的字母)则返回 True。

我意识到我的计数器计数到 13,但不确定是什么问题。

def is_anagram (worda: str , wordb: str) -> bool:
    count_same_letters = 0
    if len(worda) == len(wordb):
        for i in worda:
            for j in wordb:
                if i == j:
                    count_same_letters = count_same_letters+1
                    print(count_same_letters)
                    print(len(wordb))
        return count_same_letters == len(wordb)
    else:
        return False

print(is_anagram("anagram","nagaram"))

在尝试字符串 'abc' abd 'bca' 时,输出如我所料为 True,但字符串 'anagram' 和 'nagaram' 返回 False

python anagram
3个回答
0
投票

问题是您的代码多次计算同一个字母。尝试在此处运行您的代码 - https://pythontutor.com/ 并查看每一步的 counts.

您可以通过在标准库中使用 collections.Counter() 来简化它,以加快计数并与每个字母进行比较。


def is_anagram(str1, str2):
    a = str1.lower()        # if don't case case, can skip these steps
    b = str2.lower()
    
    return Counter(a) == Counter(b)



if __name__ == '__main__':
    string1 = 'funeral'
    string2 = 'realFun'

    print(is_anagram('anagram', 'nagaram'))   # True

    print(is_anagram(string1, string2))       # True
    print(is_anagram('abbac', 'cbbac'))       # False

0
投票

你正在浏览每一对字母。

例如,如果您有两个由 5 个字母组成的单词,那么您将经历 25 对字母。如果您输入

aaaab
baaaa
,您的
count_same_letters
计数器将达到
4*4 + 1*1
(4*4对
a
和1*1对
b
)。

改变你的算法。


0
投票

如前所述,这里的问题是多次出现的字母会被重新计算。假设您需要自己实现算法,这是解决问题的一种方法:

def is_anagram (worda: str , wordb: str) -> bool:
    if len(worda) == len(wordb):
        remaining_letters = wordb
        for letter in worda:
            letter_index = remaining_letters.find(letter)
            if letter_index == -1:
                return False # no! not anagram
            
            remaining_letters = remaining_letters[:letter_index] + remaining_letters[letter_index+1:]
        
        if len(remaining_letters) == 0:
            return True
    else:
        return False
                
print(is_anagram("anagram", "gramnaa"))
print(is_anagram("omg", "omggg"))
print(is_anagram("abc", "cba"))
print(is_anagram("aaaa", "aaaaaa"))  

通过“删除”我们从

remaining_letters
中找到的每个字母,我们的代码将不得不在每次迭代中搜索更小的字符串,可能使其比其他一些替代方案执行得更快。

© www.soinside.com 2019 - 2024. All rights reserved.