Математика 337 418 372
Невдало намагаючись реалізувати за допомогою Mathematica LongestCommonSubsequencePositions, я перейшов до відповідності шаблонів.
v=Length;
p[t_]:=Subsets[t,{2}];
f[w_]:=Module[{c,x,s=Flatten,r={{a___,Longest[y__]},{y__,b___}}:>{{a,y},{y,b},{y},{a,y,b}}},
c=p@w;
x=SortBy[Cases[s[{#/.r,(Reverse@#)/.r}&/@c,1],{_,_,_,_}],v[#[[3]]]&][[-1]];
Append[Complement[w,{x[[1]],x[[2]]}],x[[4]]]]
g[r_]:=With[{h=Complement[r,Cases[Join[p@r,p@Reverse@r],y_/;!StringFreeQ@@y:>y[[2]]]]},
FixedPoint[f,Characters/@h,v@h-1]<>""]
Правило відповідності шаблону,
r={{a___,Longest[y__]},{y__,b___}}:> {{a,y},{y,b},{y},{a,y,b}}},
бере впорядковану пару слів (представлену як списки символів) і повертає: (1) слова, {a,y}а {y,b}за ними (2) загальну підрядку,, yщо пов'язує кінець одного слова з початком іншого слова, і, нарешті, комбіноване слово, {a,y,b}яке замінить вхідні слова. Дивіться Велісарія за відповідним прикладом: /mathematica/6144/looking-for-lolong-common-substring-solution
Три послідовні символи підкреслення означають, що елемент є послідовністю нуля або більше символів.
Reverseпізніше використовується для того, щоб перевірити обидва замовлення. Ті пари, які мають спільні листи, повертаються незмінними та ігноруються.
Редагувати :
Далі вилучено зі списку слова, які "поховані" (тобто повністю містяться) в іншому слові (у відповідь на коментар @ flornquake).
h=Complement[r,Cases[Join[p@r,p@Reverse@r],x_/;!StringFreeQ@@x:> x[[2]]]]
Приклад :
{{"D", "O", "L", "O", "R", "E"}, {"L", "O", "R", "E", "M"}} /. r
повертає
{{"D", "O", "L", "O", "R", "E"}, {"L", "O", "R", "E", "M"}, { "L", "O", "R", "E"}, {"D", "O", "L", "O", "R", "E", "M"}}
Використання
g[{"LOREM", "ORE", "R"}]
AbsoluteTiming[g[{"AD", "DO", "DOLOR", "DOLORE", "LOREM", "MAGNA", "SED", "ORE", "R"}]]
"LOREM"
{0,006256, "SEDOLOREMAGNAD"}