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
그 링크, 다른 단어의 시작과 함께 한 단어의 끝과, 마지막으로, {a,y,b}
입력 단어를 대체 할 결합 된 단어 . 관련 예제는 Belisarius를 참조하십시오 : https://mathematica.stackexchange.com/questions/6144/looking-for-longest-common-substring-solution
3 개의 연속 된 밑줄 문자는 요소가 0 개 이상의 문자 시퀀스임을 나타냅니다.
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"}