在Python中查找字谜

时间:2014-12-02 03:34:18

标签: python

我在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!" 

对我来说似乎很好。但是我教授的课程说我错过了一些边缘案例。你能想到我可能错过的任何边缘案例吗?

6 个答案:

答案 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"))