Как я могу получить все уникальные комбинации символов слова? - PullRequest
3 голосов
/ 23 июля 2011

Я понимаю, как работает str_shuffle() или тасование, но я не знаю этого в этом случае.

$word="tea";

Я хочу повторить все уникальные возможности тасования (чай, тэ, эта, есть,ели, ели)

1 Ответ

4 голосов
/ 23 июля 2011

Вам необходимо произвести все перестановки строки, либо перебирая возможности, либо используя рекурсивный метод, подобный приведенному ниже. Обратите внимание, что для массива среднего размера это очень быстро вырастет. Для слова с уникальными символами количество возможных перестановок равно n! где n длина. Для шестибуквенного слова в массиве будет 720 записей! Этот метод не самый эффективный, но в зависимости от того, что вы пытаетесь сделать, он должен работать нормально.

(Источник: http://cogo.wordpress.com/2008/01/08/string-permutation-in-php/)

function permute($str) {
    /* If we only have a single character, return it */
    if (strlen($str) < 2) {
        return array($str);
    }

    /* Initialize the return value */
    $permutations = array();

    /* Copy the string except for the first character */
    $tail = substr($str, 1);

    /* Loop through the permutations of the substring created above */
    foreach (permute($tail) as $permutation) {
        /* Get the length of the current permutation */
        $length = strlen($permutation);

        /* Loop through the permutation and insert the first character of the original
        string between the two parts and store it in the result array */
        for ($i = 0; $i <= $length; $i++) {
            $permutations[] = substr($permutation, 0, $i) . $str[0] . substr($permutation, $i);
        }
    }

    /* Return the result */
    return $permutations;
}

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

$permutations = array_unique(permute($str));
...