Mathematica 337 418 372
Mathematica's kullanarak başarısızlıkla denedikten sonra LongestCommonSubsequencePositions
kalı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) y
bir 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.
Reverse
Her 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"}