我正在尝试解决上述面试问题,以检查字符串是否是彼此的字谜。实施如下:
NO_OF_CHARS = 256
def areAnagram(str1, str2):
count = [0] * NO_OF_CHARS
i = 0
while (i in str1) and (i in str2):
count[ord(i)]+=1
i += 1
if len(str1) != len(str2):
return 0
for i in xrange(NO_OF_CHARS):
if count[i]:
return 0
return 1
str1 = "geeksforgeeks"
str2 = "forgeeksgeeks"
if areAnagram(str1, str2):
print "The two strings are anagram of each other"
else:
print "The two strings are not anagram of each other"
运行代码时出现以下错误:
TypeError: 'In <string> requires string as left operand
我在while循环中做错了吗?另外,我怎样才能避免使用i = 0语句?感谢。
答案 0 :(得分:4)
查看字符串是否由相同字符组成的简单方法是将它们作为排序列表进行比较:
def is_anagram(src, trgt):
"""
Determine if trgt is an anagram of src
:param src: (str)
:param trgt: (str)
:returns: (bool) True if trgt is an anagram of src; else False
"""
return sorted(src) == sorted(trgt)
答案 1 :(得分:2)
如果你想计算字符数,你需要对两个字符串进行计数并比较它们
NO_OF_CHARS = 256
def areAnagram(str1, str2):
if len(str1) != len(str2):
return 0
count = [0] * NO_OF_CHARS
for c1,c2 in zip(str1,str2):
count[ord(c1)] +=1
count[ord(c2)] -=1
return all(not c for c in count)
为了提高效率和清晰度,我将字符串的长度检查到方法的开头
编辑:根据Blckknght的评论更新了我的答案
答案 2 :(得分:2)
在Python中执行此操作的规范方法是使用collections.Counter
:
from collections import Counter
def areAnagram(str1, str2):
return Counter(str1) == Counter(str2)
这需要O(N)
空格和时间(N
为max(len(str1), len(str2))
)。但请注意,尽管此代码的渐近性能更好,但对于短字符串而言,它可能仍然比使用sorted
的版本慢。 Python的sort
代码非常快!
如果您可能正在使用该函数来比较非常不同的字符串,那么在计算之前检查字符串长度的特殊情况可能会稍微提高一点:
def areAnagram(str1, str2):
return len(str1) == len(str2) and Counter(str1) == Counter(str2)