Я бы хотел помочь с этой проблемой.
Я думаю, что лучший способ сделать это - сгенерировать набор мощности из набора заданных символов, а затем найти набор комбинаций строк, которые может генерировать каждый набор в наборе мощности.
List <String> allPermutationsOfSubsequences( Set <Character> chars ) {
Set < Set <Character> > powerSetOfChars = generatePowerSet ( chars );
List <String> permutations = new ArrayList <String> ();
for (Set <Character> subsequence : powerSetOfChars)
permutations.addAll( generatePermutations ( subsequence ) );
return permutations;
}
Set <Set <Character>> generatePowerSet ( Set <Character> set ) {
Set < Set <Character> > powerSet = new HashSet < Set <Character> > ();
if (set.size() == 0) {
powerSet.add(new HashSet <Character> ());
return powerSet;
}
Character anElement = set.iterator().next();
set.remove(anElement);
for (Set <Character> subset : powerSet(set)) {
Set <Character> setWithElement = new HashSet <Character> ();
setWithElement.add(anElement);
setWithElement.addAll(subset);
powerSet.add(newSet);
powerSet.add(subset);
}
set.add(anElement);
return powerSets;
}
//Generates a list of permutations of the characters provided in the set.
List <String> generatePermutations ( Set <Character> chars );
Метод generatePowerSet
создает все наборы, поэтому он также включает наборы размером 0 и 1. Вы можете удалить их, если хотите, но основная идея есть.
Пример вывода: [3, 2, 1, 31, 13, 32, 23, 21, 12, 321, 312, 231, 213, 132, 123]
Все, что вам нужно сделать, это удалить те, которые размером 1.
Чтобы увидеть полный код, который был скомпилирован и показал свою работоспособность, просто зайдите сюда и попробуйте сами!
http://pastebin.com/P3YMmT2m