Можно создать перестановки (исключая дублирующее ограничение) для каждого символа, заменяя этот символ первым символом и рекурсивным путем исключения первого символа.
Теперь, если мы хотим исключить дубликаты, нам просто нужно убедиться, что мы не помещаем один и тот же символ в первую позицию дважды. Выполнение этого может быть выполнено путем сортировки символов (так что повторяющиеся символы находятся рядом друг с другом) и пропускания любого символа, который совпадает с тем, который был перед ним, или же, как символ в целевой позиции.
код Java: (полученный из a basic permutation generator)
import java.util.Arrays;
import java.util.Scanner;
public class NewMain
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
System.out.println("Enter the string:");
String s = sc.nextLine();
char[] c = s.toCharArray();
Arrays.sort(c);
System.out.println("Here are all the permutations:");
NewMain.c = c;
count = 0;
permutation(0);
System.out.println("Number of permutations = " + count);
}
static char[] c;
static int count;
static void swap(int pos1, int pos2)
{
char temp = c[pos1];
c[pos1] = c[pos2];
c[pos2] = temp;
}
public static void permutation(int start)
{
if (start == c.length)
{
System.out.println(c);
count++;
}
for (int i = start; i < c.length; i++)
{
if (i == start || (c[i] != c[i-1] && c[i] != c[start]))
{
swap(start, i);
permutation(start + 1);
swap(start, i);
}
}
}
}
Test.
Это еще не очень эффективно, если есть много повторяющихся символов.Один из способов, который я могу придумать, чтобы улучшить это, - это подсчет для каждого символа (возможно, в виде связанного списка (связанный список счетчиков), чтобы мы могли быстро удалить счетчики, достигшие 0, и вставить их назад) и, подобно выше, мы генерируем символы слева направо, пропускаем дубликаты, обрабатывая каждый счет один раз на каждом рекурсивном шаге.
Что такое комбинация дерева? Рекурсивное генерирование комбинаций? – Aravind
Возможно, вы хотите отсортировать слово лексикографически и применить некоторую функцию «nextWord», если это возможно? – Herokiller
Я думаю, что более подходящим термином является «многопозиционная перестановка». https://en.wikipedia.org/wiki/Permutation – rliu