Mathematica 337 418 372
Nachdem LongestCommonSubsequencePositionsich erfolglos versucht hatte, mit Mathematicas zu implementieren , wandte ich mich dem Mustervergleich zu.
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]<>""]
Die Mustervergleichsregel
r={{a___,Longest[y__]},{y__,b___}}:> {{a,y},{y,b},{y},{a,y,b}}},
ein geordnetes Paar von Worten (dargestellt als Listen von Zeichen) nimmt und: (1) die Worte, {a,y}und {y,b}gefolgt von (2) den gemeinsamen Teilzeichen , y, dass Links des Ende eines Wort mit dem Anfang des anderen Wortes, und, Schließlich das kombinierte Wort {a,y,b}, das die eingegebenen Wörter ersetzt. Ein ähnliches Beispiel finden Sie unter Belisarius: https://mathematica.stackexchange.com/questions/6144/looking-for-longest-common-substring-solution
Drei aufeinanderfolgende Unterstriche bedeuten, dass das Element eine Folge von null oder mehr Zeichen ist.
Reversewird später verwendet, um sicherzustellen, dass beide Aufträge getestet werden. Die Paare, die verbindbare Buchstaben gemeinsam haben, werden unverändert zurückgegeben und ignoriert.
Bearbeiten :
Das Folgende entfernt aus der Liste Wörter, die in einem anderen Wort "begraben" (dh vollständig enthalten) sind (als Antwort auf den Kommentar von @ flornquake).
h=Complement[r,Cases[Join[p@r,p@Reverse@r],x_/;!StringFreeQ@@x:> x[[2]]]]
Beispiel :
{{"D", "O", "L", "O", "R", "E"}, {"L", "O", "R", "E", "M"}} /. r
kehrt zurück
{{"D", "O", "L", "O", "R", "E"}, {"L", "O", "R", "E", "M"}, { "L", "O", "R", "E"}, {"D", "O", "L", "O", "R", "E", "M"}
Verwendung
g[{"LOREM", "ORE", "R"}]
AbsoluteTiming[g[{"AD", "DO", "DOLOR", "DOLORE", "LOREM", "MAGNA", "SED", "ORE", "R"}]]
"LOREM"
{0.006256, "SEDOLOREMAGNAD"}