все строковые комбинации фиксированной длины, основанные на кодировке - PullRequest
2 голосов
/ 23 октября 2011

Я хочу создать функцию, которая будет возвращать каждую возможную строку в пределах заданной длины строки, используя набор символов.

Например, набор символов "abc" и длина 2 должныдопускается 9 (3 ^ 2) уникальных комбинаций:

aa, ab, ac, ba, bb, bc, ca, cb, cc

(список составлен вручную)

Какой метод можно использовать для создания такой функции?

Ответы [ 2 ]

2 голосов
/ 25 октября 2011

Как всегда, есть несколько способов решить то, что вы просите, это только один способ, используя один счетчик на символ в выходной строке:

$c = "abc"; // charset
$l = 2; // string length

for($t='',$cl=strlen($c),$s=array_fill(0,$l,0),$i=pow($cl,$l);$a=0,$i--;) {
    for($t&&$t.=', ';$a<$l;$t.=$c[$s[$a++]]);
    for(;$a--&&++$s[$a]==$cl;$s[$a]=0);
};

echo $t; // the string you asked for.

aa, ab, ac, ba,bb, bc, ca, cb, cc

Один основной цикл, один цикл для построения строки и один цикл для подсчета.

Я могу себе представить, что это должно работать с получением модулей для каждой позициивыходной строки.

2 голосов
/ 23 октября 2011

Вы уже сделали пошли на это, как мы можем ясно видеть из вашего примера решения:

aa, ab, ac, ba, bb, bc, ca, cb, cc

Что вы делали в своей голове, чтобы придумать это решение? Вы должны были помнить несколько вещей:

  1. с какого символа мне начинать с charset?

  2. когда я создаю строку вывода, что такое следующий символ из набора символов?

  3. сколько символов мне разрешено выбирать из кодировки?

  4. что мне делать, когда я выбрал из кодировки все символы, которые мне разрешены?

  5. исчерпал ли я кодировку относительно символов, с которых можно начать? если да, я закончил.

Можете ли вы перевести это в код? Или этот ответ слишком привлекателен?

...