2

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);
4

3 に答える 3

3

これはどのように使われるのでしょうか?これは、あなたが提案したような単純な再帰アルゴリズムの仕事ではなく、反復的なアプローチでもありません。平均 10 桁の数字は 59,049 (3^10) 通りの可能性をもたらします。実際の単語を特定するには、それぞれを辞書に照らして評価する必要があります。

多くの場合、これに対する最善のアプローチは、10 桁の数字をさまざまな単語にマップする辞書を事前にコンパイルすることです。次に、ルックアップは定数 O(1) アルゴリズムであり、可能な単語の配列にマップされた 10 桁の数字で選択するだけです。

実際、事前にコンパイルされた辞書は、T9 が機能する方法であり、対数ルックアップ関数を使用して辞書をツリーにマッピングしていました。

于 2013-01-26T20:01:25.160 に答える
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"
}
于 2013-01-26T20:58:41.480 に答える
0

Python でのスペルチェッカーの作成に関する Norvigs の記事を読む必要がありますhttp://norvig.com/spell-correct.html。これはスペルチェッカーであり、php ではなく python ですが、可能性のあるバリエーションのある単語を見つけることに関しては同じ概念であり、いくつかの良いアイデアが得られる可能性があります。

于 2013-01-26T20:05:01.280 に答える