我正在尝试打印可以通过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);
答案 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,但是围绕找到具有可能变化的单词的概念是相同的,可能会给你一些好主意。