1

我正在尝试在 php mysql 中为 anagram finder 编写一个程序。我在数据库中有一个字典,它只有一个名为“word”的字段,它包含 500000 行。

通过使用 php,我尝试从数据库中一个一个地提取单词。在得到一个单词后,我创建了 2 个 for 循环,它执行逐个字符的比较。

例如..让输入词是'abcdef'..

考虑我正在从数据库中获取“fade”这个词..

我正在编写一个循环并检查单词淡入淡出是否在 abcdef 中。如果是,我正在打印这个单词。如果不是,我将从数据库中获取下一个单词。

我写了代码..但我得到一个空页面作为输出..请帮助..

我还有一个问题。有没有其他方法可以在不使用逐字符比较的情况下找到单词的子字符串?

例如:如果我的输入是 fedcba .. 我将其排序为 abcdef .. 并且字典单词是 fade 并且我将其排序为 adef .. 是任何函数来查找 adef 是否是 abcdef 的子字符串..

4

2 回答 2

2

您必须编写自己的用户定义函数来获取排序的字母字符串:

CREATE FUNCTION fn_sort_string(arg_word VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
    DROP TEMPORARY TABLE IF EXISTS temp;
    CREATE TEMPORARY TABLE temp(letter CHAR(1));

    SET @var_counter = 0;
    SET @var_len = LENGTH(arg_word);

    WHILE(@var_counter < @var_len)
    DO
        INSERT INTO temp VALUES (SUBSTRING(arg_word, @var_counter, 1));
        SET @var_counter = @var_counter + 1;
    END WHILE;

    SELECT GROUP_CONCAT(DISTINCT letter ORDER BY letter SEPARATOR '')
    INTO @var_sort_word
    FROM temp;

    DROP TEMPORARY TABLE IF EXISTS temp;

    RETURN IFNULL(@var_sort_word, "");
END;

以下查询将在已排序的字典单词中找到已排序的输入单词:

SELECT * 
FROM dictionary 
WHERE fn_sort_string(input_word) LIKE CONCAT('%',fn_sort_string(word),'%');
于 2012-07-24T06:17:42.933 回答
1

忘记检查 PHP 中的每个单词。这是 CPU 的噩梦!

在表格中添加第二列,并按字母顺序拼写单词。例如:

Word : AlphaWord
Test : estt

然后你可以简单地运行这样的查询:

select word from table 1 where AlphaWord = (select AlphaWord from table1 where word='$yourWord') order by word asc;

编辑:如果您不想在其他单词中匹配单词,您可以在 AlphaWord 列上弹出全文搜索索引,然后使用Match()... against()语法,这将非常快速地返回匹配项。但是,由于此运算符仅允许将通配符放在搜索字符串的末尾,因此它不会machete->aceehmtache->aceh. 话虽如此,老实说,您实际上无法在正常搜索中添加与它们匹配的通配符。

于 2012-07-24T06:19:50.720 回答