Mathematica 337 418 372
Mathematicaを使用して実装に失敗した後LongestCommonSubsequencePositions
、パターンマッチングを使用しました。
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]<>""]
パターンマッチングルール、
r={{a___,Longest[y__]},{y__,b___}}:> {{a,y},{y,b},{y},{a,y,b}}},
順序付けられた単語のペア(文字のリストとして表される)を受け取り、(1)単語、{a,y}
および{y,b}
(2)共通の部分文字列、y
1つの単語の終わりを他の単語の始まりとリンクする最後に、{a,y,b}
入力語を置き換える結合語。関連する例については、ベリサリウスを参照してください:https : //mathematica.stackexchange.com/questions/6144/looking-for-longest-common-substring-solution
3つの連続した下線文字は、要素がゼロ個以上の文字のシーケンスであることを示します。
Reverse
両方の注文がテストされることを保証するために後で採用されます。リンク可能な文字を共有するそれらのペアは変更されずに返され、無視されます。
編集:
以下は、(@ flornquakeのコメントに応じて)別の単語に「埋め込まれている」(完全に含まれている)単語をリストから削除します。
h=Complement[r,Cases[Join[p@r,p@Reverse@r],x_/;!StringFreeQ@@x:> x[[2]]]]
例:
{{"D", "O", "L", "O", "R", "E"}, {"L", "O", "R", "E", "M"}} /. r
返す
{{「D」、「O」、「L」、「O」、「R」、「E」}、{「L」、「O」、「R」、「E」、「M」}、{ 「L」、「O」、「R」、「E」}、{「D」、「O」、「L」、「O」、「R」、「E」、「M」}}
使用法
g[{"LOREM", "ORE", "R"}]
AbsoluteTiming[g[{"AD", "DO", "DOLOR", "DOLORE", "LOREM", "MAGNA", "SED", "ORE", "R"}]]
「ロレム」
{0.006256、「SEDOLOREMAGNAD」}