-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpermutations.py
More file actions
31 lines (26 loc) · 1.02 KB
/
permutations.py
File metadata and controls
31 lines (26 loc) · 1.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def permutations(string):
return partial_permutations("", sorted(string))
def partial_permutations(partial, letters):
if len(letters) == 0:
return [partial]
permutations = []
previous_letter = None
for i, letter in enumerate(letters):
if letter == previous_letter:
continue
next_partial = partial + letter
next_letters = letters[:i] + letters[(i+1):]
permutations += partial_permutations(next_partial, next_letters)
previous_letter = letter
return permutations
import unittest
class Test(unittest.TestCase):
def test_permutations(self):
self.assertEqual(permutations("abca"), ["aabc", "aacb", "abac", "abca",
"acab", "acba", "baac", "baca", "bcaa", "caab", "caba", "cbaa"])
self.assertEqual(permutations("ABCD"), ["ABCD", "ABDC", "ACBD", "ACDB",
"ADBC", "ADCB", "BACD", "BADC", "BCAD", "BCDA", "BDAC", "BDCA",
"CABD", "CADB", "CBAD", "CBDA", "CDAB", "CDBA", "DABC", "DACB",
"DBAC", "DBCA", "DCAB", "DCBA"])
if __name__ == "__main__":
unittest.main()