Самый длинный префикс + суффикс-комбинация в наборе строк

77
9

У меня есть набор строк (менее 30) от 1 до 30. Мне нужно найти подмножество, по крайней мере, двух строк, которые разделяют максимально возможную комбинацию prefix- +.

Например, пусть множество

Foobar
Facar
Faobaron
Gweron
Fzobar

Префикс/суффикс F/ar имеет объединенную длину 3 и совместно используется Foobar, Facar и Fzobar; префикс/суффикс F/obar имеет объединенную длину 5 и совместно используется Foobar и Fzobar. F/obar префиксом/суффиксом является F/obar.

Обратите внимание, что это не следует путать с самым длинным общим префиксом/суффиксом, поскольку только две или более строк из набора должны использовать один и тот же префикс + суффикс. Также обратите внимание, что сумма длин как префикса, так и суффикса - это то, что должно быть максимизировано, поэтому их необходимо учитывать. Префикс или суффикс могут быть пустой строкой.

Кто-нибудь знает об эффективном методе его реализации?

спросил(а) 2021-01-25T19:30:37+03:00 4 месяца, 4 недели назад
1
Решение
108

Как насчет этого:

maxLen := -1;
for I := 0 to Len(A) - 1 do
if Len(A[I]) > maxLen then // (1)
for J := 0 to Len(A[I]) do
for K := 0 to Len(A[I]) - J do
if J+K > maxLen then // (2)
begin
prf := LeftStr(A[I], J);
suf := RightStr(A[I], K);
found := False;
for m := 0 to Len(sufList) - 1 do
if (sufList[m] = suf) and (prfList[m] = prf) then
begin
maxLen := J+K;
Result := prf+'/'+suf;
found := True;
// (3)
n := 0;
while n < Len(sufList) do
if Len(sufList[n])+Len(prfList[n]) <= maxLen then
begin
sufList.Delete(n);
prfList.Delete(n);
end
else
Inc(n);
// (end of 3)
Break;
end;
if not found then
begin
sufList.Add(suf);
prfList.Add(prf);
end;
end;

В этом примере maxLen содержит сумму длин самого длинного найденного префикса/суффикса. Самой важной частью этого является линия, обозначенная (2). Он обходит множество ненужных сравнений строк. В разделе (3) он исключает любой существующий префикс/суффикс, который короче, чем только что найденный (лебедка дублируется).

ответил(а) 2021-01-25T19:30:37+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема