Python 检查两个字符串的排列

Python 检查两个字符串的排列,python,permutation,anagram,Python,Permutation,Anagram,我确实有一个问题,我正试图用最有效的方法来解决它 给定两个字符串,找出这两个字符串是否是彼此的置换 我知道简单的方法(即对两个字符串排序)等等 我想看看我的方法是否适用于所有情况,我不确定,所以我需要你的意见和投入 def CheckPermutaionsBySumUp(firstString, secondString): if (len(firstString) != len(secondString)): return False firstStringCount

我确实有一个问题,我正试图用最有效的方法来解决它

给定两个字符串,找出这两个字符串是否是彼此的置换

我知道简单的方法(即对两个字符串排序)等等

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

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),而且比使用数组和数据结构更节省空间


我唯一关心的是,两个长度相同、字符不同的字符串是否有可能具有相同的求和?

您的推理,并且扩展一下,您的方法通常不适用。一个快速反例:

firstString='ad'

secondString='bc'


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

对于相同长度的两个完全不同的字符串,其总和可能相同

例如:

 '03' # Sum: 99
 '12' # Sum: 99
这样想:

如果增加一个字符的值(通过写入“1”而不是“0”),则只需将另一个字符的值减少相同的量即可使其平衡。添加字符值不足以检查排列。

如果需要
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

公平地说,有时小的输入比极端情况下想象的要容易得多!干杯,谢谢你。我想知道“黑匣子”的功能,因为我的重点是实现算法,而不是使用函数为我实现。它看起来很有趣,如果我能从学习背后的东西中受益的话it@John,为了复制逻辑,创建两个dict,将每个单词中的字母映射到频率,然后比较两个dict中的字母和计数,如果len(a)!=len(b)我们可以直接返回False。我明白了,如果你在下面的答案中看到我的评论,这就是我当时找到的解决方案之一!谢谢你。(好的,用户删除了他/她的答案)@PadraicCunningham抱歉,我已经删除了我的答案,因为它不合适。这是John之前的评论:“一种简单的方法,但需要2个带整数的数组,如果字符串是ASCII格式的,则需要大小为128的数组,即在字符数字表示的位置增加该数组中的值,然后比较两个数组。”@PadraicCunningham感谢您,我标记了另一个用户的答案,因为它是回答实际问题的答案,但你的答案也很有趣。@John:如果你想将它保存在一个变量中,而不使用数据结构,你可以利用Python的无限大小
int
s,并将计数放在不同的“偏移”处在指数为:stringCount+=len(string)**ord(char)的整数中,为什么使用
str.join()
?比较
sorted(s1)==sorted(s2)
将返回一个
bool
并完成案例。注意:
sorted()
将返回已排序的字符串。
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))
def permutation(s1, s2):
    if len(s1) != len(s2): 
        return False
    return ' '.join(sorted(s1)) == ' '.join(sorted(s2))