如何获得单词字符的所有独特组合?

时间:2011-07-23 01:02:56

标签: php arrays unique shuffle

我理解str_shuffle()或shuffle是如何工作的,但在这种情况下我不知道。

$word="tea";

我想要回应所有独特的洗牌可能性(茶,tae,eta,吃,吃,吃)

1 个答案:

答案 0 :(得分:4)

您需要通过迭代可能性或使用下面的递归方法来生成字符串的所有排列。请注意,对于中等大小的阵列,这将非常快速地增长。对于具有唯一字符的单词,可能的排列数为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;
}

请注意,这种有点天真的实现不会正确处理重复的字母(例如,'seed',有两个e`s)。如上面的源代码所示,如​​果单词包含多个相同的字母,您可以使用以下代码来消除重复:

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