我尝试创建一个函数,如果两个单词是彼此的字谜(具有相同的字母)则返回 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
问题是您的代码多次计算同一个字母。尝试在此处运行您的代码 - 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
你正在浏览每一对字母。
例如,如果您有两个由 5 个字母组成的单词,那么您将经历 25 对字母。如果您输入
aaaab
和baaaa
,您的count_same_letters
计数器将达到4*4 + 1*1
(4*4对a
和1*1对b
)。
改变你的算法。
如前所述,这里的问题是多次出现的字母会被重新计算。假设您需要自己实现算法,这是解决问题的一种方法:
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
中找到的每个字母,我们的代码将不得不在每次迭代中搜索更小的字符串,可能使其比其他一些替代方案执行得更快。