|
Problem: Of two strings, find the largest substring common to both.
This macro finds the largest leftmost in the shorter of the strings. Can it
be improved ?
%macro GCSS (s1, s2, gcs);
%local i j s1 s2;
%let _i = _i&sysindex.;
%let _j = _j&sysindex.;
%let _l = _l&sysindex.;
%let _s1 = _s1&sysindex.;
%let _s2 = _s2&sysindex.;
if length (&s1) <= length(&s2)
then do; &_s1 = &s1; &_s2 = &s2; end;
else do; &_s1 = &s2; &_s2 = &s1; end;
&gcs = &_s1; %* set length of &gcs;
&gcs = "";
&_l = 0;
do &_i = 1 to length (&_s1);
do &_j = 1 to length (&_s1) - &_i +1;
if index (&_s2, substr(&_s1,&_i,&_j)) then do;
if &_j > &_l then do;
&_l = &_j;
&gcs = substr(&_s1,&_i,&_j);
end;
end;
end;
end;
* drop &_i &_j &_l &_s1 &_s2;
%mend;
options mprint;
data _null_;
length s1 s2 $35;
s1 = 'Frankenstein';
s2 = 'Frankenburger';
%gcss (s1,s2,gcss);
put gcss= s1= s2= ;
s1 = 'a Frankenstein';
s2 = 'Mmmm, Frankenburger';
%gcss (s1,s2,gcss);
put gcss= s1= s2= ;
s1 = 'Frankeula';
s2 = 'eula';
%gcss (s1,s2,gcss);
put gcss= s1= s2= ;
s1 = 'ccbbaa';
s2 = 'aabb';
%gcss (s1,s2,gcss);
put gcss= s1= s2= ;
run;
.....
gcss=Franken s1=Frankenstein s2=Frankenburger
gcss=Franken s1=a Frankenstein s2=Mmmm, Frankenburger
gcss=eula s1=Frankeula s2=eula
gcss=aa s1=ccbbaa s2=aabb
--
Richard A. DeVenezia
http://www.devenezia.com/
|