Самая длинная общая часть / longest common part

177
29 января 2018, 06:54

Добрый вечер, есть код который выводит самую длинную часть в двух словах, в данном случае "ааа". Подскажите пожалуйста, как можно сделать, чтобы в случае нескольких таких частей они все выводились. Конкретно здесь "ааа" и "оо"

$array = array(
    'Argoolaaa',
    'Banaaanoo' );
function longestCommonPart($words) {
    $words = array_map('strtolower', array_map('trim', $words));
    $sort_by_strlen = create_function('$a, $b', 'if (strlen($a) == strlen($b))
    { return strcmp($a, $b); } return (strlen($a) < strlen($b)) ? -1 : 1;');
    usort($words, $sort_by_strlen);
    $longestCommonPart = array();
    $shortest_string = str_split(array_shift($words));
    while (sizeof($shortest_string)) {
        array_unshift($longestCommonPart, '');
        foreach ($shortest_string as $ci => $char) {
            foreach ($words as $wi => $word) {
                if (!strstr($word, $longestCommonPart[0] . $char)) {
                    break 2;
                }
            }
            $longestCommonPart[0] .= $char;
        }
        array_shift($shortest_string);
    }
    usort($longestCommonPart, $sort_by_strlen);
    return array_pop($longestCommonPart); }
echo longestCommonPart($array);
Answer 1

В этом примере будут найдены повторяющиеся буквы, расположенные рядом друг с другом, начиная от двух и более совпадений, и при условии, что эти совпадения есть более чем в одном слове

$text = 'Добрый ввеер, еесть код котооорый вывооодит...';
$words = explode(' ', $text);
var_dump( check_matches($words) );

function check_matches($words) {
    $array = [];
    $result = [];
    foreach ($words as  $word) {
        preg_match_all('~(\pL)\1+~u', $word, $arr);
        !$arr[0] ?: $array[] = $arr[0];
    }
    do {
        $first_array = array_shift($array);
        foreach ($array as $arr) {
            $temp = array_intersect($first_array, $arr);
            !$temp ?: $result[] = join($temp);
        }
    } while (count($array));
    return $result;
}

Результат:

array (size=3)
  0 => string 'ее' (length=4)
  1 => string 'ооо' (length=6)

Демо

Answer 2

Доброе время суток. Честно лень было вникать в код, но через регулярные выражения решается достаточно просто. Если я правильно понял

$array = array(
    'Argoolaaa',
    'Banaaanoo'
);
$pattern = "#(.)\\1{1,}#m";
foreach ($array as $el) {
    $mattches = [];
    preg_match_all($pattern, $el, $mattches);
    foreach ($mattches[0] as $f) {
        echo $f . PHP_EOL;
    }
}
READ ALSO
Как вставить ссылку на JS в другой файл JS?

Как вставить ссылку на JS в другой файл JS?

Есть ссылка на документ JS вида:

171
Php. Вывод массива

Php. Вывод массива

Как можно вывести данные из массива в таком порядке как на картинкеТ

170
Перегрузка оператора [ ]

Перегрузка оператора [ ]

Не совсем понимаю, как работает перегруженный оператор [] в следующем коде:

298