我在Python中通过以下方式解决了这个问题:
s1,s2 = raw_input().split()
set1 = set(s1)
set2 = set(s2)
diff = len(set1.intersection(s2))
if(diff == 0)
print "Anagram!"
else:
print "Not Anagram!"
对我来说似乎很好。但是我教授的课程说我错过了一些边缘案例。你能想到我可能错过的任何边缘案例吗?
答案 0 :(得分:4)
解决这个问题的正确方法是计算两个字符串中的字符数,并比较每个字符串以查看所有字符是否相同且计数是否相同。
Python有一个collections.Counter
来为你完成这项工作。所以,你可以简单地做到
from collections import Counter
if Counter(s1) == Counter(s2):
print "Anagram!"
else:
print "Not Anagram!"
如果您不想使用Counter
,可以使用普通词典滚动自己的版本,然后进行比较。
def get_frequency(input_string):
result = {}
for char in input_string:
result[char] = result.get(char, 0) + 1
return result
if get_frequency(s1) == get_frequency(s2):
print "Anagram!"
else:
print "Not Anagram!"
答案 1 :(得分:2)
使用已排序:
>>> def using_sorted(s1,s2):
... return sorted(s1)==sorted(s2)
...
>>> using_sorted("hello","llho")
False
>>> using_sorted("hello","llhoe")
True
您也可以使用count
:
>>> def using_count(s1,s2):
... if len(s1)==len(s2):
... for x in s1:
... if s1.count(x)!=s2.count(x):
... return False
... return True
... else: return False
...
>>> using_count("abb","ab")
False
>>> using_count("abb","bab")
True
>>> using_count("hello","llohe")
True
>>> using_count("hello","llohe")
sorted
解决方案以O(n lg n)
复杂度运行,count
解决方案以O(n ^ 2)
复杂度运行,而Counter
解决方案在O(N).
中运行
注意collections.Counter
最好使用
检查@fourtheye解决方案
答案 2 :(得分:1)
另一种没有排序的方法是考虑所有字母:
>>> def anagram(s1, s2):
... return sum([ord(x)**2 for x in s1]) == sum([ord(x)**2 for x in s2])
...
>>> anagram('ark', 'day')
False
>>> anagram('abcdef', 'bdefa')
False
>>> anagram('abcdef', 'bcdefa')
True
>>>
答案 3 :(得分:0)
不要用集理论来做:
代码:
a='aaab' b='aab' def anagram(a,b): setA=list(a) setB=list(b) print setA, setB if len(setA) !=len(setB): print "no anagram" diff1 =''.join(sorted(setA)) diff2= ''.join(sorted(setB)) if (diff1 == diff2 ): print "matched" else: print "Mismatched" anagram(a,b)
答案 4 :(得分:0)
def anagrams (s1, s2):
# the sorted strings are checked
if(sorted(s1.lower())== sorted(s2.lower())):
return True
else:
return False
答案 5 :(得分:0)
在一根衬里检查字谜
def anagram_checker(str1, str2):
"""
Check if the input strings are anagrams of each other
Args:
str1(string),str2(string): Strings to be checked
Returns:
bool: Indicates whether strings are anagrams
"""
return sorted(str1.replace(" ", "").lower()) == sorted(str2.replace(" ", "").lower())
print(anagram_checker(" XYZ","z y x"))