• PHP实现全排列(递归算法)


    算法描述:如果用P表示n个元素的全排列,而Pi表示n个元素中不包含元素i的全排列,(i)Pi表示在排列Pi前面加上前缀i的排列,那么n个元素的全排列可递归定义为:
        ① 如果n=1,则排列P只有一个元素i;
        ② 如果n>1,则全排列P由排列(i)Pi构成;
    根据定义,可以看出如果已经生成(k-1)个元素的排列Pi,那么k个元素的排列可以在每个Pi前面加上元素i而生成。

    1、

     1 <?php
     2 function rank($base, $temp=null)
     3 {
     4     $len = strlen($base);
     5     if($len <= 1)
     6     {
     7         echo $temp.$base.'<br/>';
     8     }
     9     else
    10     {
    11         for($i=0; $i< $len; ++$i)
    12         {
    13             rank(substr($base, 0, $i).substr($base, $i+1, $len-$i-1), $temp.$base[$i]);
    14         }
    15     }
    16 }
    17 rank('123');

    不过,这样的算法有个问题:若是存在相同的元素,则全排列有重复。例如'122'的全排列只有三种情况:'122'、'212'、'221';上面方法却有重复。

    2、在上面算法的基础上价格判重操作即可

     1 <?php
     2 function fsRank($base, $temp=null)
     3 {
     4     static $ret = array();
     5     $len = strlen($base);
     6     if($len <= 1)
     7     {
     8         //echo $temp.$base.'<br/>';
     9         $ret[] = $temp.$base;
    10     }
    11     else
    12     {
    13         for($i=0; $i< $len; ++$i)
    14         {
    15             $had_flag = false;
    16             for($j=0; $j<$i; ++$j)
    17             {
    18                 if($base[$i] == $base[$j])
    19                 {
    20                     $had_flag = true;
    21                     break;
    22                 }
    23             }
    24             if($had_flag)
    25             {
    26                 continue;
    27             }
    28             fsRank(substr($base, 0, $i).substr($base, $i+1, $len-$i-1), $temp.$base[$i]);
    29         }
    30     }
    31     return $ret;
    32 }
    33 print '<pre>';
    34 print_r(fsRank('122'));
    35 print '</pre>';
    36 ?>
  • 相关阅读:
    python后端项目编码规范检查——pre-commit的使用
    centos7安装docker-compose
    python使用pandas将MySQL表数据写入Excel表格
    Sublime Text3中隐藏了菜单,怎么显示出来?
    Docker学习篇
    服务端|性能测试入门指南 (慎入: 6000 字长文)
    登录界面测试用例设计
    Date与String的转换,Date的加减计算(前一小时,前一个月、、、)
    关于SQL分页计算公式
    Java
  • 原文地址:https://www.cnblogs.com/Steven-shi/p/5813486.html
Copyright © 2020-2023  润新知