Для этого вам не нужна рекурсия. Вот итерационный алгоритм:
String master = "abcd";
final int L = master.length();
List<String> list = new ArrayList<String>();
list.add(master);
Set<String> current = new HashSet<String>(list);
for (int i = L-1; i >= 2; i--) {
Set<String> next = new HashSet<String>();
for (String s : current) {
for (int k = 0; k < s.length(); k++) {
next.add(s.substring(0, k) + s.substring(k + 1));
}
}
list.addAll(current = next);
}
System.out.println(list);
// prints "[abcd, abc, abd, bcd, acd, ac, ad, ab, bc, bd, cd]"
По сути, это поиск в ширину в глубине души. Вы начинаете с набора current
, изначально содержащего String master
. Затем на каждой итерации i
вы проходите через for (String s : current)
и генерируете набор next
, который вы делаете, удаляя все возможные символы из s
.
Effective Java 2nd Edition: пункт 25. Предпочитайте списки массивам , но если вы настаиваете на сохранении в String[]
, вы можете просто сделать следующее в конце.
String[] arr = list.toArray(new String[0]);
Смотри также