Используйте рекурсию, идея такова:
Для каждого рекурсивного вызова ввод строки уменьшается на 1 символ, результирующая строка сохраняется в строковом массиве tmp. Например:
вызов 1: abc
вызов 2: ab, последний символ: c
вызов 3: a, последний символ: b
затем возьмите последний символ и вставьте его в список строк в tmp во всех возможных положениях, например:
tmp содержит: a, последний символ: b
вставьте b в позиции 0 и 1, получив "ab" и "ba"
результат - возврат к списку вывода, и процесс продолжается.
псевдокод примерно такой:
get_perm (input):
string[] tmp, out
if input lengh == 1 //base case
add input to tmp
return tmp;
tmp = get_permu (input[0 to input.length -1])
char last_char = input[input.length - 1]
//loop thru the string in tmp
for string str in tmp:
string tmp_str = str //create a tmp copy
int len = tmp_str.lengh //get the len
//insert last_char to all possible position
for j=0 to len:
new_str = (add last_char to tmp_str in j position)
out.add(new_str)
return out