Я ищу метод для сравнения скремблированных слов со списком слов, полным unscrambled слов, например:
скремблированное слово «lonbayb», и где-то в списке слов есть слово «babylon». сценарий должен показать мне расшифрованное слово
любая идея, как решить эту проблему?
Чтобы перетасовать слова, используйте str_shuffle()
. Чтобы сравнить перетасованную строку со списком слов, вы можете использовать count_chars()
.
class WordFinder { protected $_wordList; protected $_map; public function __construct(array $wordList) { $this->_wordList = $wordList; } protected function _initMap() { if(!is_array($this->_map)) { $this->_map = array(); foreach($this->_wordList as $word) { $key = count_chars($word, 3); if(!isset($this->_map[$key])) { $this->_map[$key] = array(); } $this->_map[$key][] = $word; } } } public function findWords($searchWord) { $searchWord = count_chars($searchWord, 3); $this->_initMap(); if(isset($this->_map[$searchWord])) { return $this->_map[$searchWord]; } return false; } }
Тогда сделайте
$list = array('evil', 'live', 'vile', 'cat'); $finder = new WordFinder($list); var_dump($finder->findWords('evli'));
И это вернет
array(3) { [0]=> string(4) "evil" [1]=> string(4) "live" [2]=> string(4) "vile" }
EDIT Я обменяю оригинальный код с этой версией, так как он намного лучше работает с большими списками слов. Я протестировал выше на моем 2,2 Ghz Dual Core и завершил 10000 вызовов findWords () в коллекции из 10000 слов всего за 0,08 секунды. Другая версия займет 207 секунд. См. Версию для старой версии.
Простым решением, которое приходит на ум, является сортировка букв как скремблированных, так и с расшифрованных слов в алфавитном порядке перед сравнением. Я назову это «перетасовкой»:
"babylon" ==> "abblnoy"
С практической точки зрения, вы должны создать второй список слов из вашего справочного списка слов, при этом ссылочный список слов будет иметь свои записи, перетасованные таким образом.
а затем, когда вы смотрите на новое слово и хотите узнать, находится ли он в списке, перетасуйте его так же, и вы можете сделать простой поиск в вашем перетасованном списке ссылок. Если вы сортируете слова в перетасованном списке ссылок по алфавиту, вы можете даже выполнить двоичный поиск на нем. Или вы помещаете перетасованные ссылочные слова в hashset или b-tree … все, что легко быстро найти.