php中字符串的置换

php中字符串的置换,php,optimization,permutation,Php,Optimization,Permutation,我在查找长度大于7的字符串的字符串排列时遇到了代码问题。例如“abcdefgh”。我必须找到长度不超过12的单词排列。请查看我的代码,并建议是否可以进行任何优化 function permute($str) { if (strlen($str) < 2) { return array($str); } $permutations = array(); $tail = substr($str, 1); foreach (pe

我在查找长度大于7的字符串的字符串排列时遇到了代码问题。例如“abcdefgh”。我必须找到长度不超过12的单词排列。请查看我的代码,并建议是否可以进行任何优化

function permute($str)
{
    if (strlen($str) < 2) 
    {
        return array($str);
    }

    $permutations = array();
    $tail = substr($str, 1);
    foreach (permute($tail) as $permutation) 
    {
        $length = strlen($permutation);

        for ($i = 0; $i <= $length; $i++) 
        {
            $permutations[] = substr($permutation, 0, $i) . $str[0] . substr($permutation, $i);
        }
    }

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

$arr = permute('abcdefghijkl');
函数排列($str)
{
如果(strlen($str)<2)
{
返回数组($str);
}
$permutations=array();
$tail=substr($str,1);
foreach(permute($tail)作为$permutation)
{
$length=strlen($permutation);

对于($i=0;$i来说,解决方案的核心似乎应该是不检查所有内容。例如,如果你给我“地震”一词,那么很明显,字典中没有任何以“qk”开头的词,因此检查
q k
形式的所有排列是不必要的。这种类型的检查将为您节省大量比较和查找操作。仅此“qk”示例就排除了362880(9!)个您需要检查的排列


因此,与其计算所有排列,然后从字典中找出与其中一个排列匹配的排列,我会确保您生成的每个排列实际上首先是一个可能的单词。

您能估计长度为
n
的字符串的排列数,以及该数的增长速度吗它?排列在O(n!)中运行因此,运行12个长度的字符串需要很长时间,因为12!是一个很大的数字。虽然有一个技巧可以在多项式时间内生成第n个置换,但如果你想要所有置换,你需要计算所有n!个。我的实际问题是从数据库中获取所有可能的字符串组合,用于语法游戏。我很累。。找不到长度为12的字符串的正确解决方案和算法。我认为您需要考虑另一种方法来完成此操作。您的数据库中似乎将有10亿条“in语句”?