在Python中查找字谜

问题描述 投票:1回答:5

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

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

python
5个回答
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!"

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解决方案


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
>>>

0
投票

不要用set理论做:

码:


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)


0
投票

the anagram check with two strings

def anagrams (s1, s2): 

    # the sorted strings are checked  
    if(sorted(s1.lower())== sorted(s2.lower())): 
        return True  
    else: 
        return False
© www.soinside.com 2019 - 2024. All rights reserved.