<?php
function binary_search($elem, $array) {
$top = sizeof($array) -1;
$bot = 0;
while($top >= $bot) {
$p = floor(($top + $bot) / 2);
if ($array[$p] < $elem)
$bot = $p + 1;
elseif ($array[$p] > $elem)
$top = $p - 1;
else
return TRUE;
}
return FALSE;
}
$handle = @fopen("/usr/share/dict/words", "r");
if ($handle) {
while (($buffer = fgets($handle, 4096)) !== false) {
$words[] = trim($buffer);
}
fclose($handle);
}
sort($words);
function getmultiplewords($word1, $word2, &$dict){
if (strlen($word1)==0) return;
if (binary_search($word1, $dict) && binary_search($word2, $dict)) {
echo $word2 . " / " . $word1. "\n";
}
$word2 = $word2 . substr($word1,0,1);
$word1 = substr($word1,1);
getmultiplewords($word1, $word2, $dict);
}
getmultiplewords("cartalk","", $words);
getmultiplewords("superman","", $words);
?>
Вот простое решение, которое ищет 2-словосочетания.
Работает на linux с файлом / usr / share / dict / words , в противном случае вам придется загрузить файл самостоятельно здесь:
http://www.freebsd.org/cgi/cvsweb.cgi/src/share/dict/web2?rev=1.12;content-type=text%2Fplain
Если вы хотите n разбиение слов, которое можно сделать и для слов разумного размера :) Просто дайте мне знать, и я посмотрю на это.