Mathematica 337 418 372
Mathematica's kullanarak başarısızlıkla denedikten sonra LongestCommonSubsequencePositionskalıp eşleştirmeye döndüm.
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]<>""]
Desen eşleştirme kuralı,
r={{a___,Longest[y__]},{y__,b___}}:> {{a,y},{y,b},{y},{a,y,b}}},
sıralı bir sözcük çifti alır (karakter listeleri olarak gösterilir) ve şunu döndürür: (1) sözcükleri {a,y}ve {y,b}ardından (2) ybir sözcüğün sonunu diğer kelimenin başlangıcıyla bağlayan ortak alt dize ve Sonunda, {a,y,b}giriş sözcüklerinin yerini alacak olan birleşik kelime İlgili bir örnek için Belisarius'a bakınız: https://mathematica.stackexchange.com/questions/6144/looking-for-longest-common-substring-solution
Ardışık üç alt çizgi karakteri, öğenin sıfır veya daha fazla karakter dizisi olduğunu gösterir.
ReverseHer iki siparişin test edilmesini sağlamak için daha sonra kullanılır. Bağlanabilir harfleri paylaşan çiftler değiştirilmez ve dikkate alınmaz.
Düzenle :
Aşağıdaki, başka bir kelimeyle "gömülen" (yani tamamen yerleşmiş) (@ flornquake'in yorumuna cevap olarak) listesindeki kelimeleri kaldırır.
h=Complement[r,Cases[Join[p@r,p@Reverse@r],x_/;!StringFreeQ@@x:> x[[2]]]]
Örnek :
{{"D", "O", "L", "O", "R", "E"}, {"L", "O", "R", "E", "M"}} /. r
döner
{{"D", "O", "L", "O", "R", "E"}, {"L", "O", "R", "E", "M"}, { "L", "O", "R", "E"}, {"D", "O", "L", "O", "R", "E", "M"}}
kullanım
g[{"LOREM", "ORE", "R"}]
AbsoluteTiming[g[{"AD", "DO", "DOLOR", "DOLORE", "LOREM", "MAGNA", "SED", "ORE", "R"}]]
"LOREM"
{0.006256, "SEDOLOREMAGNAD"}