sub nCommonSubstrLenL {
my( $haystack, $needle, $len ) = @_;
( $haystack, $needle ) = ( $needle, $haystack )
if length( $haystack ) < length( $needle ); # Added
my $count = 0;
my %possibles;
for my $ni ( 0 .. length( $needle ) - $len ) {
my $possible = substr( $needle, $ni, $len );
next if ++$possibles{ $possible } > 1;
++$count if 1+index $haystack, $possible;
}
return $count;
}
####
sub nCommonSubstrLenL2 {
my( $haystack, $needle, $len ) = @_;
( $haystack, $needle ) = ( $needle, $haystack )
if length( $haystack ) < length( $needle ); ## Added.
# my $pattern = "A$len X" x int( length( $needle ) / $len );
my $pattern = (" A$len" . 'X' x ( $len-1 )) x (length( $needle ) - $len +1);
my $count = 0;
my %possibles;
for my $possible ( unpack $pattern, $needle ) {
next if ++$possibles{ $possible } > 1;
++$count if 1+index $haystack, $possible;
}
return $count;
}
##
##
sub nCommonSubstrGreaterLenL {
my( $haystack, $needle, $len ) = @_;
my $count = 0;
my %possibles;
for my $l ( $len .. length( $needle ) ) {
my $sofar = $count;
for my $ni ( 0 .. length( $needle ) - $l ) {
my $possible = substr( $needle, $ni, $l );
next if ++$possibles{ $possible } > 1;
## print( "$possible : $count" ),
++$count if 1+index $haystack, $possible;
}
last unless $count > $sofar;
}
return $count;
}
print 'Buk:', nCommonSubstrGreaterLenL 'ABCDEF','ABDEFCBDEAB', 2;
__END__
AB : 0
DE : 1
EF : 2
DEF : 3
Buk:4