Checking if two strings are permutations of each other in Python

前端 未结 22 2295
旧时难觅i
旧时难觅i 2020-12-08 16:04

I\'m checking if two strings a and b are permutations of each other, and I\'m wondering what the ideal way to do this is in Python. From the Zen of

相关标签:
22条回答
  • 2020-12-08 16:06

    heuristically you're probably better to split them off based on string size.

    Pseudocode:

    returnvalue = false
    if len(a) == len(b)
       if len(a) < threshold
          returnvalue = (sorted(a) == sorted(b))
       else
           returnvalue = naminsmethod(a, b)
    return returnvalue
    

    If performance is critical, and string size can be large or small then this is what I'd do.

    It's pretty common to split things like this based on input size or type. Algorithms have different strengths or weaknesses and it would be foolish to use one where another would be better... In this case Namin's method is O(n), but has a larger constant factor than the O(n log n) sorted method.

    0 讨论(0)
  • 2020-12-08 16:06
    def matchPermutation(s1, s2):
      a = []
      b = []
    
      if len(s1) != len(s2):
        print 'length should be the same'
      return
    
      for i in range(len(s1)):
        a.append(s1[i])
    
      for i in range(len(s2)):
        b.append(s2[i])
    
      if set(a) == set(b):
        print 'Permutation of each other'
      else:
        print 'Not a permutation of each other'
      return
    
    #matchPermutaion('rav', 'var') #returns True
    matchPermutaion('rav', 'abc') #returns False
    
    0 讨论(0)
  • 2020-12-08 16:08
    def permute(str1,str2):
        if sorted(str1) == sorted(str2):
            return True
        else:
            return False
    
    str1="hello"
    str2='olehl'
    a=permute(str1,str2)
    print(a
    
    0 讨论(0)
  • 2020-12-08 16:10

    This is an O(n) solution in Python using hashing with dictionaries. Notice that I don't use default dictionaries because the code can stop this way if we determine the two strings are not permutations after checking the second letter for instance.

    def if_two_words_are_permutations(s1, s2):
        if len(s1) != len(s2):
            return False
        dic = {}
    for ch in s1:
        if ch in dic.keys():
            dic[ch] += 1
        else:
            dic[ch] = 1
    for ch in s2:
        if not ch in dic.keys():
            return False
        elif dic[ch] == 0:
            return False
        else:
            dic[ch] -= 1
    return True
    
    0 讨论(0)
  • 2020-12-08 16:13

    Go with the first one - it's much more straightforward and easier to understand. If you're actually dealing with incredibly large strings and performance is a real issue, then don't use Python, use something like C.

    As far as the Zen of Python is concerned, that there should only be one obvious way to do things refers to small, simple things. Obviously for any sufficiently complicated task, there will always be zillions of small variations on ways to do it.

    0 讨论(0)
  • 2020-12-08 16:13

    This is derived from @patros' answer.

    from collections import Counter
    
    def is_anagram(a, b, threshold=1000000):
        """Returns true if one sequence is a permutation of the other.
    
        Ignores whitespace and character case.
        Compares sorted sequences if the length is below the threshold,
        otherwise compares dictionaries that contain the frequency of the
        elements.
        """
        a, b = a.strip().lower(), b.strip().lower()
        length_a, length_b = len(a), len(b)
        if length_a != length_b:
            return False
        if length_a < threshold:
            return sorted(a) == sorted(b)
        return Counter(a) == Counter(b)  # Or use @namin's method if you don't want to create two dictionaries and don't mind the extra typing.
    
    0 讨论(0)
提交回复
热议问题