Mathematica 337 418 372
Po bezskutecznych próbach implementacji przy użyciu Mathematica LongestCommonSubsequencePositions, przeszedłem do dopasowywania wzorców.
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]<>""]
Reguła dopasowywania wzorców,
r={{a___,Longest[y__]},{y__,b___}}:> {{a,y},{y,b},{y},{a,y,b}}},
pobiera uporządkowaną parę słów (przedstawionych jako listy znaków) i zwraca: (1) słowa, {a,y}a {y,b}następnie (2) wspólny podłańcuch y, który łączy koniec jednego słowa z początkiem drugiego słowa, i, wreszcie połączone słowo {a,y,b}, które zastąpi słowa wejściowe. Zobacz pokrewny przykład Belizariusza: /mathematica/6144/looking-for-longest-common-substring-solution
Trzy kolejne znaki podkreślenia oznaczają, że element jest sekwencją zero lub więcej znaków.
Reversejest zatrudniony później, aby zapewnić przetestowanie obu zamówień. Te pary, które mają wspólne litery, są zwracane w niezmienionej formie i ignorowane.
Edytuj :
Poniższe słowa usuwają z listy słowa, które są „zakopane” (tj. W pełni zawarte) w innym słowie (w odpowiedzi na komentarz @ flornquake).
h=Complement[r,Cases[Join[p@r,p@Reverse@r],x_/;!StringFreeQ@@x:> x[[2]]]]
Przykład :
{{"D", "O", "L", "O", "R", "E"}, {"L", "O", "R", "E", "M"}} /. r
zwraca
{{„D”, „O”, „L”, „O”, „R”, „E”}, {„L”, „O”, „R”, „E”, „M”}, { „L”, „O”, „R”, „E”}, {„D”, „O”, „L”, „O”, „R”, „E”, „M”}}
Stosowanie
g[{"LOREM", "ORE", "R"}]
AbsoluteTiming[g[{"AD", "DO", "DOLOR", "DOLORE", "LOREM", "MAGNA", "SED", "ORE", "R"}]]
„LOREM”
{0,006256, „SEDOLOREMAGNAD”}