检查两个字符串的排列

时间:2015-10-13 20:54:18

标签: python permutation anagram

我确实有问题,我正在尝试使用最有效的方法来解决它。

“给定两个字符串,找出两个字符串是否相互排列。”

我知道直截了当的方法(即排序两个字符串)等。

我想看看我的方法是否适用于所有情况,我不确定,所以我需要您的意见和意见。

def CheckPermutaionsBySumUp(firstString, secondString):
   if (len(firstString) != len(secondString)):
      return False

   firstStringCount = 0
   secondStringCount = 0

   for char in firstString:
      firstStringCount += ord(char)

   for char in secondString:
      secondStringCount += ord(char)

   if firstStringCount == secondStringCount:
      return True

   return False

所以我的方法是,我确实有一个有用的约束,并且如果两个字符串的长度不同,那么这两个字符串不是彼此的排列。

然后,知道每个字符都有唯一的数字表示,如果我使用ord函数总结每个字符串的每个字母的数量,我可以比较两个总和并找出这两个字符串排列。在我看来,这个解决方案不仅仅是O(n),而且比使用数组和数据结构更节省空间。

我唯一担心的是,有两个字符串,长度相同,字符不同,有相同的总和吗?

5 个答案:

答案 0 :(得分:6)

如果您需要O(n)解决方案,请使用每个字符串中字符的计数:

from collections import Counter
def is_anagram(a,b):
    if len(a) != len(b):
         return False
    return  Counter(a) == Counter(b)

如果你有一个字谜,每个字符串的数量和字母必须相同:

In [45]: is_anagram("foo","oof")
Out[45]: True

In [46]: is_anagram("foobar","raboof")
Out[46]: True

In [47]: is_anagram("foobar","foo")
Out[47]: False

答案 1 :(得分:4)

你的推理,并且通过扩展你的方法一般不成立。一个快速的反例:

firstString =' ad'

secondString =' bc'

两个字符串的长度均为2,字符总和为197。

答案 2 :(得分:1)

相同长度的两个完全不同的字符串可能具有相同的总和。

例如:

 '03' # Sum: 99
 '12' # Sum: 99

以这种方式思考:

如果增加一个字符的值(通过写'1'而不是'0'),你只需要将另一个字符的值减少相同的量即可。添加字符值不足以检查排列。

答案 3 :(得分:0)

str1 = raw_input('Enter First String: ')
str2 = raw_input('Enter Second String: ')

def check_permutation(str1, str2):
    if(len(str1) != len(str2)):
        return 'Not Permutation strings'
    #initialize the track_duplicates to 0 to track if the exsisting character at the index of str2 is already matched
    track_duplicates = [0] * len(str2) 
    is_permutations = True
    for c1 in str1:
        c1_in_str2 = False
        i = 0
        for c2 in str2:
            if(c1 == c2 and track_duplicates[i] is 0):
                c1_in_str2 = True
                track_duplicates[i] = 1
                break
            i += 1
        if(not c1_in_str2):
            is_permutations = False
            break
    if(is_permutations):
        return 'Permutation Strings'
    else:
        return 'Not Permutaions Strings'


print(check_permutation(str1, str2))

答案 4 :(得分:-1)

def permutation(s1, s2):
    if len(s1) != len(s2): 
        return False
    return ' '.join(sorted(s1)) == ' '.join(sorted(s2))