php – 如何有效地生成给定长度字母的所有可能字母组合的数组?

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – 如何有效地生成给定长度字母的所有可能字母组合的数组?脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
想象一下,我有一袋26个拼字砖 – 英文字母中每个字母一个.

我的目标是创建一个包含最多n个字母的所有可能字符串的数组.说n = 3.

约束:

>字母必须始终按字母顺序排列(abc,而不是CBA;组合,而不是排列)
>字符串必须< = n个字母长(允许算法突破给定长度的任何循环)
>信件不得重复(A,不是AA)

何在PHP中最有效地生成此数组?

换句话说,如何避免暴力循环通过所有可能的组合并过滤掉那些与上述规则不匹配的组合?

如果我的字母只包含3个字母 – $alphabet = range(‘a’,’c’); – 我希望输出7个项目(3C1 3C2 3C3):[A,B,C,AB,AC,BC,ABC].

如果我的字母只包含4个字母 – $alphabet = range(‘a’,’d’); – 我期望输出15个项目(4C1 4C2 4C3 4C4):[A,D,AD,BD,CD,ABC,ABD,ACD,BCD,ABCD] .但是如果我想限制只有字符串< = 3个字母长,那么我会忽略ABCD,只产生14个项目(4C1 4C2 4C3).

$alphabet = range('a','z');

PRint_r(generate_strings($alphabet,1));
// expected output: A,...Z

print_r(generate_strings($alphabet,2));
// exPEcted output: A..Z,AB..AZ,BC..BZ,..YZ

print_r(generate_strings($alphabet,3));
// expected output: A..Z,AB..YZ,ABC..XYZ

print_r(generate_strings($alphabet,10));
// expected output: A .. JKLMN .. AGKQRZ .. QRSTUVWXYZ
//                        ^         ^          ^10 character max,no repeats
//                        |         still alphabetical order
//                        alphabetical order

function generate_strings($alphabet,$max_word_length) {

    // how can I efficiently generate this array
    // wIThout brute force looping through all of
    // the invalid and duplicate items like AA and CBA?

    return $array_of_all_possible_strings;
}

解决方法

觉得这看起来很有趣.这是我的尝试,因为它值得:

function recurse($letters,&amp;$words,$start,$end,$depth,$prefix = "") {
    $depth--;
    for ($i = $start; $i < $end; $i++) {
        $word = $prefix . $letters[$i];
        $words[] = $word;
        if ($depth) recurse($letters,$words,++$start,$word);
    }
}
function generate_strings($letters,$max_word_length) {
    $words = array();
    recurse($letters,count($letters),$max_word_length);
    return $words;      
}

脚本宝典总结

以上是脚本宝典为你收集整理的php – 如何有效地生成给定长度字母的所有可能字母组合的数组?全部内容,希望文章能够帮你解决php – 如何有效地生成给定长度字母的所有可能字母组合的数组?所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。