我怎么能解决这个可能的三个字母的单词

时间:2016-04-21 03:57:14

标签: php

我想解决可能的三个字母的问题

Here is following words. (17 characters)
19920620forestJSR
How many possible ways to make 3 length word with given characters?
Ex: 192, 162, Rer, ….
Rule:
Number 0 is different alpha o. (0 != o)
case-sensitive is available. (R != r)
same character repeat not available. (rr1 : wrong)
Hint:
17 16 15 : wrong

我该如何解决?

我正在尝试使用此代码

function permute($str,$i,$n) {
   if ($i == $n)
       print "$str\n";
   else {
        for ($j = $i; $j < $n; $j++) {
          swap($str,$i,$j);
          permute($str, $i+1, $n);
          swap($str,$i,$j); // backtrack.
       }
   }
}


function swap(&$str,$i,$j) {
    $temp = $str[$i];
    $str[$i] = $str[$j];
    $str[$j] = $temp;
}   

$str='19920620forestJSR';
permute($str,0,strlen($str)); 

但是在输出中有一些数字字符错误

输出看起来像(当str = 19920620forestJSR时)

n���Z��뢿�Yh��fzj+�ȳz��ߍ�シo+^��aj�-y�k��m��e�ƭ{�6�ټ�zȧo�h���j���Z�ǫ���������z�a���X�y�����

输出看起来像(当str = forestJSR时)

foresSJtR
foresSJRt
foresStJR
foresStRJ
foresSRtJ
foresSRJt
foresRJSt
foresRJtS

1 个答案:

答案 0 :(得分:1)

规则说你需要 3 个字符的组合,没有重复字母。您的代码生成了17个字母的所有组合。因此,脚本循环了数百万种可能性(355,687,428,096,000)。

一次取r的n个不同对象的排列数

nPr = n! / (n - r)! 

因此,对于“19920620forestJSR”(仅限14个不同的字母),一次使用3个:

14P3 = 14! / (14 - 3)! = 14! / 11! = (14)(13)(12) = 2184