打印可以通过电话号码形成的所有字符串排列

时间:2013-01-26 19:57:37

标签: php algorithm

我正在尝试打印可以通过php中的电话号码形成的可能单词。我的一般策略是将每个数字映射到一个可能的字符数组。然后我迭代遍历每个数字,递归调用函数迭代每个可能的字符。

这是我的代码到目前为止的样子,但它还没有成功。我可以使用任何语法更正来使其工作吗?

$pad = array(
        array('0'), array('1'), array('abc'), array('def'), array('ghi'),
        array('jkl'), array('mno'), array('pqr'), array('stuv'), array('wxyz')    
);   

function convertNumberToAlpha($number, $next, $alpha){

    global $pad;
    for($i =0; $i<count($pad[$number[$next]][0]); $i++){
        $alpha[$next] = $pad[$next][0][$i];

        if($i<strlen($number) -1){
            convertNumberToAlpha($number, $next++, $alpha);
        }else{
            print_r($alpha);
        }
    }    
}


$alpha = array();
convertNumberToAlpha('22', 0, $alpha);

3 个答案:

答案 0 :(得分:3)

这将如何使用?这不是一个简单的递归算法的工作,例如你所建议的,甚至是迭代方法。平均10位数将产生59,049(3 ^ 10)种可能性,如果您想确定实际单词,则必须根据字典对其进行评估。

很多时候,最好的方法是预先编译一个将10位数字映射到不同单词的字典。然后,你的查找是一个常数O(1)算法,只需选择一个10位数字,该数字映射到一个可能的单词数组。

事实上,预编译的词典是T9的工作方式,将字典映射到具有对数查找功能的树。

答案 1 :(得分:1)

以下代码应该这样做。相当简单:它使用递归,每个级别处理一个输入字符,在每次递归调用时构建/传递当前组合的副本,递归在处理输入的最后一个字符的级别停止。

function alphaGenerator($input, &$output, $current = "") {
    static $lookup = array(
        1 => "1",    2 => "abc", 3 => "def",
        4 => "ghi",  5 => "jkl", 6 => "mno",
        7 => "pqrs", 8 => "tuv", 9 => "wxyz",
        0 => "0"
    );
    $digit = substr($input, 0, 1);          // e.g. "4"
    $other = substr($input, 1);             // e.g. "3556"
    $chars = str_split($lookup[$digit], 1); // e.g. "ghi"
    foreach ($chars as $char) {             // e.g. g, h, i
        if ($other === false) {             // base case
            $output[] = $current . $char;
        } else {                            // recursive case
            alphaGenerator($other, $output, $current . $char);
        }
    }
}
$output = array();
alphaGenerator("43556", $output);
var_dump($output);

输出:

array(243) {
  [0]=>string(5) "gdjjm"
  [1]=>string(5) "gdjjn"
  ...
  [133]=>string(5) "helln"
  [134]=>string(5) "hello"
  [135]=>string(5) "hfjjm"
  ...
  [241]=>string(5) "iflln"
  [242]=>string(5) "ifllo"
}

答案 2 :(得分:0)

你应该阅读Norvigs关于用Python http://norvig.com/spell-correct.html编写拼写检查器的文章。虽然它是一个拼写检查器并且在python中不是php,但是围绕找到具有可能变化的单词的概念是相同的,可能会给你一些好主意。