गणितज्ञ 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}
जो इनपुट शब्दों को बदल देगा। संबंधित उदाहरण के लिए बेलिसरिज़ देखें: /mathematica/6144/looking-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 "," E "," M "}}
प्रयोग
g[{"LOREM", "ORE", "R"}]
AbsoluteTiming[g[{"AD", "DO", "DOLOR", "DOLORE", "LOREM", "MAGNA", "SED", "ORE", "R"}]]
"Lorem"
{0.006256, "SEDOLOREMAGNAD"}