Mathematica 337 418 372
หลังจากพยายามนำไปใช้งานโดยไม่ประสบผลสำเร็จ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 สำหรับตัวอย่างที่เกี่ยวข้อง: /mathematica/6144/look-for-longest-common-substring-solution
อักขระขีดล่างที่ต่อเนื่องกันสามตัวมีความหมายว่าองค์ประกอบนั้นเป็นลำดับของอักขระศูนย์หรือมากกว่า
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", "R", "E", "M"}}
การใช้
g[{"LOREM", "ORE", "R"}]
AbsoluteTiming[g[{"AD", "DO", "DOLOR", "DOLORE", "LOREM", "MAGNA", "SED", "ORE", "R"}]]
"Lorem"
{0.006256, "SEDOLOREMAGNAD"}