Permutate a string letters recursively in python

Let us say we have a string and we want to permutate through its letter . So for example

  • if the string is empty it will return an empty list
  • if it contains only one characters it must return a list containing only one character 'a' ->['a']
  • if it contains two characters it must return a list containing the permutation of these characters
    1. 'ab' ->['ab','ba']
  • if it contains three characters it must return a list containing the permutation of these three characters ,
    1. 'abc'->
    2. [
    3. 'abc' , 'acb' , 'bac', 'bca' , 'cab' , 'cba'
    4. ]

    the solution for this problem recursively is the following

  1. '''
  2.     [] -> []
  3.     [a] -> [a]
  4.     [a,b]

  5.         [a] + [b]
  6.         [b] + [a]

  7.     [a,b,c]
  8.         [a] + [b,c]
  9.                 [a] + [b] + [c]
  10.                 [a] + [c] + [b]
  11.         [b] + [a,c]
  12.                 [b] + [a] + [c]
  13.                 [b] + [c] + [a]
  14.         [c] + [a,b]
  15.                 [c] + [a] + [b]
  16.                 [c] + [b] + [a]
  17.      
  18. '''


  19. def permutateString(string):
  20.     if len(string) == 0:
  21.         return []
  22.     if len(string) == 1:
  23.         return [string]
  24.     # enumerate throuhh the string reusievly
  25.     result = []
  26.     for index, char in enumerate(string):
  27.         result.extend(
  28.             [char + _string for _string in permutateString(string[0:index] + string[index+1:])])
  29.     return result


  30. if __name__ == '__main__':
  31.     print(permutateString(''))
  32.     print(permutateString('a'))
  33.     print(permutateString('ab'))
  34.     print(permutateString('abc'))
  35.     print(permutateString('abcd'))
  36.     print(permutateString('O*H_'))

  37. /*
  38. output
  39. []
  40. ['a']
  41. ['ab', 'ba']
  42. ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
  43. ['abcd', 'abdc', 'acbd', 'acdb', 'adbc', 'adcb', 'bacd', 'badc', 'bcad', 'bcda', 'bdac', 'bdca', 'cabd', 'cadb', 'cbad', 'cbda', 'cdab', 'cdba', 'dabc', 'dacb', 'dbac', 'dbca', 'dcab', 'dcba']
  44. ['O*H_', 'O*_H', 'OH*_', 'OH_*', 'O_*H', 'O_H*', '*OH_', '*O_H', '*HO_', '*H_O', '*_OH', '*_HO', 'HO*_', 'HO_*', 'H*O_', 'H*_O', 'H_O*', 'H_*O', '_O*H', '_OH*', '_*OH', '_*HO', '_HO*', '_H*O']

  45. */