Я бы сделал что-то вроде:
<?php
$words = array('experts', 'exchange', 'expert', 'sexchange');
// build trie
$t = array();
foreach ($words as $word)
{
$n = &$t;
for ($i = 0; $i < strlen($word); ++$i)
{
$c = $word[$i];
if (!isset($n[$c])) $n[$c] = array();
$n = &$n[$c];
}
$n['.'] = true;
}
$word = 'expertsexchange';
$n = $t;
for ($i = 0; $i < strlen($word); ++$i)
{
$c = $word[$i];
if (isset($n['.']))
{
$o = $t;
for ($j = $i; $j < strlen($word); ++$j)
{
$d = $word[$j];
if (!isset($o[$d])) break;
$o = $o[$d];
}
# found match
if ($j == strlen($word) && isset($o['.']))
{
echo substr($word, 0, $i).",".substr($word,$i).",".$word."\n";
}
}
if (isset($n[$c]))
{
$n = $n[$c];
}
else
break;
}
?>
Results:
expert,sexchange,expertsexchange
experts,exchange,expertsexchange
Я написал это на месте, поэтому он может работать не совсем правильно.Но идея состоит в том, чтобы построить дерево префиксов и пройтись по нему.Каждый раз, когда вы найдете префикс (обозначенный знаком «.»), Продолжайте снова с вершины дерева, чтобы посмотреть, сможете ли вы найти суффикс с этой точки.Это предполагает, что вы ничего не хотите между префиксом и суффиксом.