Mathematica 337 418 372
Dopo aver tentato senza successo di implementare utilizzando Mathematica LongestCommonSubsequencePositions, sono passato al pattern matching.
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]<>""]
La regola di corrispondenza dei modelli,
r={{a___,Longest[y__]},{y__,b___}}:> {{a,y},{y,b},{y},{a,y,b}}},
prende una coppia ordinata di parole (rappresentate come elenchi di caratteri) e restituisce: (1) le parole {a,y}e {y,b}seguita da (2) la sottostringa comune y, che collega la fine di una parola con l'inizio dell'altra parola, e, infine, la parola combinata {a,y,b}che sostituirà le parole di input. Vedi Belisarius per un esempio correlato: /mathematica/6144/looking-for-longest-common-substring-solution
Tre caratteri di sottolineatura consecutivi indicano che l'elemento è una sequenza di zero o più caratteri.
Reverseviene utilizzato in seguito per garantire che entrambi gli ordini vengano testati. Le coppie che condividono lettere collegabili vengono restituite invariate e ignorate.
Modifica :
Quanto segue rimuove dall'elenco le parole "sepolte" (cioè completamente contenute) in un'altra parola (in risposta al commento di @ flornquake).
h=Complement[r,Cases[Join[p@r,p@Reverse@r],x_/;!StringFreeQ@@x:> x[[2]]]]
Esempio :
{{"D", "O", "L", "O", "R", "E"}, {"L", "O", "R", "E", "M"}} /. r
ritorna
{{"D", "O", "L", "O", "R", "E"}, {"L", "O", "R", "E", "M"}, { "L", "O", "R", "E"}, {"D", "O", "L", "O", "R", "E", "M"}}
uso
g[{"LOREM", "ORE", "R"}]
AbsoluteTiming[g[{"AD", "DO", "DOLOR", "DOLORE", "LOREM", "MAGNA", "SED", "ORE", "R"}]]
"LOREM"
{0.006256, "SEDOLOREMAGNAD"}