Intereting Posts
Картирование – встроенный документ Mongodb в Symfony2 php найти emoji Могу ли я визуализировать представление, не возвращая его в контроллере действий в zend framework 2? Проблема с AJAX, загружающая скрипт php, вызываемый из onclick; Как получить идентификатор электронной почты пользователей в приложении Facebook с использованием PHP? Как использовать переменную в двух разных файлах Php? Каков самый безопасный способ добавления html / css / js в mysql? PHP – скрыть параметры url (GET) Как удалить элементы с одним и тем же ключом префикса в memcached с помощью расширения PHP memcache? Разбор данных JSON для Duplicatable Form для PHP для Mail Сравнение PHP и 2 многомерных массивов на основе двух ключевых значений Symfony2 – определить, находится ли пользователь в защищенном брандмауэре MySQL выдает подключение к сайту с php сгладить многомерный массив в текст csv с помощью PHP Линейный маршрут Laravel 5.1

PHP словарь класс? или альтернатива?

В принципе, то, что я ищу, это какой-то класс или метод для реализации словаря в PHP. Например, если я строю слово unscrambler – скажем, я использовал буквы «a, e, l, p, p». Количество возможностей для размещения огромно – как я могу отображать только те, которые являются фактическими словами (яблоко, бледность и т. Д.)?

Благодаря!

    Классические проблемы поиска слов могут быть эффективно решены с помощью Trie .

    Я бы предложил найти список слов, скажем, из WordNet , сохранить его в Trie, а затем быстро просмотреть возможные слова.

    Решение будет иметь вид:

    1. загрузить список слов
    2. хранить список слов в три
    3. принять ввод для слова для разборки
    4. попробуйте перестановки i = 1..N

      а. перестановка подстановки я использую trie

      б. если есть положительный результат, сохраните это для отображения

      с. итерация (i ++)

    5. повторите с 3.

    редактировать:

    Обратите внимание на то, что для любого символа слова N длины может быть N! требуемый поиск (для 7 символов, которые будут 5040). Вы должны подумать о том, чтобы сделать некоторые оптимизации для алгоритма поиска trie. Например, вы получаете значительную эффективность, выбирая недопустимые подстроки раньше и не повторяя концевых перестановок.

    например, с учетом слова яблоко, если у вас была перестановка, в которой вы выбрали «ppl» в качестве первых трех символов, слово не будет найдено. Итак, независимо от того, как вы переставляете a и e в конце, вы не можете построить слово. Раннее завершение перестановок может быть важно для эффективности вашего алгоритма.

    Ах, а другой ответ:

    Если вы просто хотите получить все реальные слова – тогда найдите большой словарь. затем сохраните его в виде:

    слово | гашиш

    где слово – это само слово, а хэш сортируется в алфавитном порядке буквами:

    для хеша яблока будет: aelpp или aelp2

    то для заданных букв пересекаются все комбинации, используя один и тот же алгоритм для хэширования и поиска по этой таблице.

    вы также можете рассмотреть pspell

    http://php.net/manual/en/book.pspell.php

    $ps = pspell_new("en"); foreach(array('alppe', 'plape', 'apple') as $word) if(pspell_check($ps, $word)) echo $word; 

    Сохраните список слов в файле или базе данных, а затем попробуйте все комбинации. Вы также можете рассмотреть вероятное положение гласных против согласных, чтобы потенциально ускорить его. Вместо того, чтобы создавать собственный список слов, вы можете использовать что-то вроде WordNet .

    Мне действительно нравится решение zerkms лучше, но вот еще один

    создать 2 таблицы

     words ----- word_id (primary key) word letter_index ----- letter (idx) word_id (idx) 

    Когда вы добавляете слово в таблицу слов, вы должны добавить запись в letter_index для каждой уникальной буквы. У letter_index есть первичный ключ, основанный как на букве, так и на word_id.
    Чтобы найти слова, состоящие из группы букв, вы создаете запрос:

     SELECT word FROM words w // for each letter in the search INNER JOIN letter_index i ON ( w.word_id = i.word_id AND i.letter = letter_1 ) INNER JOIN letter_index i ON ( w.word_id = i.word_id AND i.letter = letter_2 ) INNER JOIN letter_index i ON ( w.word_id = i.word_id AND i.letter = letter_3 ) ... INNER JOIN letter_index i ON ( w.word_id = i.word_id AND i.letter = letter_n ) 

    или вы можете использовать developer.dictionary.com api и просто выполнить поиск слов для проверки. также может выполнять проверки орфографии.