-1

我希望在 PHP 中简化 T9 移动输入法的实现,即使用 Trie 或任何其他简单且最佳的解决方案。

任何帮助将不胜感激。

4

1 回答 1

-1

它可能效率不高,并且可能有一些更好的解决方案来解决您的问题,并且它也有一些限制,例如,如果您输入的数字超过 15 位,它可能无法正常工作。但我只是试图在不使用 Tries 的情况下分享我的想法,它可能会给你一些想法。试着分享你的经验。

<?php

$T9Array = array(
    2 => array('a', 'b', 'c'),
    3 => array('d', 'e', 'f'),
    4 => array('g', 'h', 'i'),
    5 => array('j', 'k', 'l'),
    6 => array('m', 'n', 'o'),
    7 => array('p', 'q', 'r', 's'),
    8 => array('t', 'u', 'v'),
    9 => array('w', 'x', 'y', 'z')
);

function search_combination($input)
{
    global $T9Array;
    if (! is_numeric($input))
        return false;
    $arr = str_split($input);
    $total = 1;
    for($a = count($arr) - 1; $a >= 0; $a--)
    {
        $total *= count($T9Array[$arr[$a]]);
        $t[$a] = $total;
    }
    sort($t);
    for ($b = 0; $b < count($arr); $b++)
    {
        $k = $l = 0;
        $j = count($arr) - ($b + 2);
        for ($c = 0; $c < $total; $c++)
        {
            $ret[$c] .= $T9Array[$arr[$b]][$l];
            if ($j >= 0 && $c == ($t[$j] * ($k+1)) - 1 || $j < 0)
            {
                $k++;
                if ($l < count($T9Array[$arr[$b]]) - 1)
                    $l++;
                else
                    $l = 0;
            }
        }
    }
    return $ret;
}

function search_combination_str($string)
{
    global $T9Array;
    if (empty($string))
        return false;
    $arr = str_split(strtolower($string));
    foreach ($arr as $a)
    {
        foreach ($T9Array as $key => $val)
        {
            $tmp = array_keys($val, $a);
            if ($tmp)
                $conv .= $key;
        }
    }
    return search_combination($conv);
}

?>
于 2014-08-19T08:33:43.113 回答