def get_permutations(s):
if(len(s) == 0):
print("No string given.")
return None
if(len(s) > 2):
permutations = get_permutations(s[:-1])
last_letter = s[-1]
#Creates a list 'permutations' for first two letters of string
#like for s = 'abcd', permutations = ['ab', 'ba']
if(len(s) == 2):
permutations = []
j = 0
while j < len(s):
perms = s[0:j] + last_letter + s[j:-1]
permutations.append(perms)
j += 1
#Creates permutations by putting last letter of the string in all
#possible positions of the string
else:
current_permutations_len = len(permutations)
for elem in permutations[:current_permutations_len]:
k = 0
while k <= len(elem):
perms = elem[0:k] + last_letter + elem[k:]
permutations.append(perms)
k += 1
# Removes the permutations that came from previous recursion
# and only saves the newly generated permutations
permutations = permutations[current_permutations_len:]
return permutations
s = 'abcd'
permutations = get_permutations(s)
if(len(s) > 0): # To avoid traceback if len(permutations) == 0
print("Total permutations: ", len(permutations))
print(permutations)
I can't callculate the Big O time of this code. The idea is: We generate all permutations of a string s(1) • • • s(n) by "chopping off" the last character and generating all permutations of s(1) • • • s(n-1). Once we have the list of all permutations of s(1) • • • s(n-1), we iterate through this list. For each string in it, we insert s(n) into every location of the string.
Here is a little presentation:
Case "ab" - -> {"ab", "ba"}
P("abc") insert "c" into all locations of all strings in {"ab","ba"}
P("abc") merge({"cab", ""acb", "abc"}, {"cba", abca", bac"})
P("abc") {"cab", "acb", "abc", "cba", "bca", bac"}
If possible, can someone suggest some improvements to reduce Big O time for this