от
Как бы я идти о создании список всех возможных перестановок строки между X и y символов, содержащий список переменных знаков. Любой язык будет работать, но это должен быть портативный.

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста подтвердите адрес электронной почты.

31 Ответы

0 голосов
от
Как бы я идти о создании список всех возможных перестановок строки между X и y символов, содержащий список переменных знаков. Любой язык будет работать, но это должен быть портативный.
0 голосов
от
Есть несколько способов сделать это. Общие методы использовать рекурсию, мемоизация, или динамического программирования. Основная идея заключается в том, что вы производите список всех строк длины 1, затем в каждой итерации для всех строк, произведенных в последней итерации, добавить эту строку конкатенировать с каждым символом в отдельности строку. (индексная переменная в ниже код отслеживает старт последней и следующей итерации) Некоторые псевдокод:
list = originalString.split('')
index = (0,0)
list = [""]
for iteration n in 1 to y:
  index = (index[1], len(list))
  for string s in list.subset(index[0] to end):
    for character c in originalString:
      list.add(s   c)
тогда тебе надо удалить все строки меньше, чем Х в длину, они будут первыми (х-1) * лен(исходная_строка) записи в списке.
0 голосов
от
Лучше использовать поиск с возвратом
#include
0 голосов
от
Вы собираетесь получить много строк, это точно... \sum_{я=х}^г{\фрац{Р!}{{(р-я)}!}} http://www.codecogs.com/eq.latex?\sum_{i=x}^y { \frac{r!}{{(r-i)}!} } Где, X и Y как вы определите их, а R-количество символов мы выбираем из ... если я тебя правильно поняла. Вы обязательно должны создать их как нужно, а не халтурить и говорить, генерировать секунд, а затем фильтр длина строк. Следующий определенно не самый лучший способ для создания этих, но интересно, тем не менее. Кнута (том 4, выпуск № 2, 7.2.1.3) говорит нам, что (S,Т)-сочетание приравнивается к s 1, что т в период с повторения-с (с,T)-комбинация нотации кнута, равным {Т \выбрать {с т} http://www.codecogs.com/eq.latex?{t \choose {s Т%7О%7Д. Мы можем выяснить это, создав сначала каждый (с,т)-комбинации в двоичной форме (так, длины (с т)) и подсчет числа 0 на каждый 1. 10001000011101 --> будет перестановка: {0, 3, 4, 4, 4, 1}
0 голосов
от
По данным Кнуть, пример не рекурсивное решение:
def nextPermutation(perm):
    k0 = None
    for i in range(len(perm)
0 голосов
от
Вы можете посмотреть на "эффективно перечисления подмножеств набора", который описывает алгоритм, чтобы сделать часть того, что вы хотите - быстро сгенерировать все подмножества из n символов из длина X до y. Он содержит реализацию в C. Для каждого подмножества, вам все равно придется генерировать все перестановки. Например, если вы хотели 3 персонажей из "АБВГД", этот алгоритм даст тебе "Азбука","Абд", "Эйб"... но вам придется переставлять каждый, чтобы получить "АСВ", "Бач", "ДСС" и т. д.
0 голосов
от
Некоторые работы Java-кода на основе ответа Ккзп:
public class permute {

    static void permute(int level, String permuted,
                    boolean used[], String original) {
        int length = original.length();
        if (level == length) {
            System.out.println(permuted);
        } else {
            for (int i = 0; i
0 голосов
от
Вот такое простое решение в C#. Он генерирует только различных перестановок из заданной строки.
    static public IEnumerable
0 голосов
от
Есть много хороших ответов здесь. Я также предлагаю очень простое рекурсивное решение на C .
#include
0 голосов
от
Я просто выдумал это быстрая в Ruby:
def perms(x, y, possible_characters)
  all = [""]
  current_array = all.clone
  1.upto(y) { |iteration|
    next_array = []
    current_array.each { |string|
      possible_characters.each { |c|
        value = string   c
        next_array.insert next_array.length, value
        all.insert all.length, value
      }
    }
    current_array = next_array
  }
  all.delete_if { |string| string.length
...