php - 为anagram解算器添加通配符

时间:2013-06-02 05:58:25

标签: php anagram

如果我甚至无法提供我所尝试的内容,我很抱歉,因为我甚至无法知道从哪里开始。

我有这个anagram解决方案,效果很好,问题是我希望能够添加允许用户包含的功能吗?作为进入该领域的通配符。

例如,假设用户输入了他们的字母fjsiem?。显然是?任何字母。因此,结果将显示与字段中的字母匹配的单词以及包含任何其他字母的任何其他单词。

我也希望能够在包含通配符的每个单词中指出通配符(字母),以便我可以更改其颜色,以便用户知道哪些单词具有通配符。

是否有人可以查看我的代码并帮助我?

被调用的单词文件是combined.txt,它只包含每个新行中的单词。

            <?
            if(!empty($_POST['l'])) {
                $time_start = microtime(true);
                $l = $_POST['l'];
                $l = strtolower($l);
                $len = strlen($l);

                $a = array('a' => 1, 'b' => 1, 'c' => 1, 'd' => 1, 'e' => 1, 'f' => 1, 'g' => 1, 'h' => 1, 'i' => 1, 'j' => 1, 'k' => 1, 'l' => 1, 'm' => 1, 'n' => 1, 'o' => 1, 'p' => 1, 'q' => 1, 'r' => 1, 's' => 1, 't' => 1, 'u' => 1, 'v' => 1, 'w' => 1, 'x' => 1, 'y' => 1, 'z' => 1);

                function contains($word) {
                    $wlen = strlen($word);
                    if($wlen < 2 || $wlen > 10) return FALSE;

                    for($i = 0; $i < $wlen; $i++) {
                        $w[$i] = $word[$i];
                    }

                    $b = $GLOBALS['b'];    
                    foreach($b as $n => $c) {
                        foreach($w as $k => $v) {
                            if($v == $c) {
                                unset($w[$k]);
                                unset($b[$n]);
                                break;
                            }
                        }
                    }
                    if(count($w) > 0) return FALSE;
                    return TRUE;
                }


                for($i = 0; $i < $len; $i++) {
                    $b[$i] = $l[$i];
                    unset($a[$l[$i]]);
                }

                $e = 'cat combined.txt';
                while(list($k) = each($a)) {
                    if(!$e) {
                        $e = "grep -v $k combined.txt";
                    } else {
                        $e .= ' | grep -v '. $k;
                    }
                }

                exec($e, $o);

                settype($w, 'array');
                foreach($o as $v) {
                    if(contains($v)) {
                        $w[] = $v;
                    }
                }

                function mycmp($a, $b) {
                    $ca = strlen($a);
                    $cb = strlen($b);
                    if($ca == $cb) return 0;
                    if($ca > $cb) return 1;
                    return -1;
                }
                usort($w, 'mycmp');

                $wc = 0; 
                foreach($w as $v) {
                    $c = strlen($v);
                    if($wc != $c) {
                        echo "<p>\n";
                        echo "<b>$c letter words</b><br>";
                    }
                    $wc = $c;
                    echo "$v  &nbsp; ";
                }
            }
            ?>

1 个答案:

答案 0 :(得分:0)

如果你想变得非常懒,你总能解决fjsiem?通过fjsiemz在fjsiema上运行你的工作代码。

如果我正确地阅读你的代码,那么你找到的是单词列表,只有那些带有f的单词列表,然后是其中的aj,然后是其中的s,然后是其中的i,然后是其中的ae,然后是他们中的一个。所以留下7个字母长的任何和所有单词,。{7}必须符合您的标准。