sub lcss_brute {
my( $r1, $r2, $min ) = @_;
my( $l1, $l2, $swap ) = ( length $$r1, length $$r2, 0 );
( $r1, $r2, $l1, $l2, $swap ) = ( $r2, $r1, $l2, $l1, 1 ) if $l1 > $l2;
my( $best, @solns ) = 0;
for my $start ( 0 .. $l2 - 1 ) {
for my $l ( reverse 1 .. $l1 - $start ) {
my $substr = substr( $$r1, $start, $l );
my $o = index( $$r2, $substr );
next if $o < 0;
if( $l > $best ) {
$best = length $substr;
@solns = [ $substr, $start, $o ];
}
elsif( $l == $best ) {
push @solns, [ $substr, $start, $o ];
}
}
}
return \@solns;
}
####
pp lcss_brute( \'xxxyyxxy', \'yyyxyxx', 1 );
C:\test>lcss-test.pl
[["yyx", 1, 3], ["yxx", 4, 4]]
####
#! perl -slw
use strict;
use Data::Dump qw[ pp ]; $Data::Dump::WIDTH = 1000;
use Algorithm::Combinatorics qw[ variations_with_repetition permutations ];
sub lcss_brute {
my( $r1, $r2, $min ) = @_;
my( $l1, $l2, $swap ) = ( length $$r1, length $$r2, 0 );
( $r1, $r2, $l1, $l2, $swap ) = ( $r2, $r1, $l2, $l1, 1 ) if $l1 > $l2;
my( $best, @solns ) = 0;
for my $start ( 0 .. $l2 - 1 ) {
for my $l ( reverse 1 .. $l1 - $start ) {
my $substr = substr( $$r1, $start, $l );
my $o = index( $$r2, $substr );
next if $o < 0;
if( $l > $best ) {
$best = length $substr;
@solns = [ $substr, $start, $o ];
}
elsif( $l == $best ) {
push @solns, [ $substr, $start, $o ];
}
}
}
return \@solns;
}
my @chars = 'a' .. 'e';
my $iter1 = permutations( \@chars );
while( $_ = $iter1->next ) {
my $long = join '', @$_;
for my $l ( 2 .. $#chars ) {
my $iter = variations_with_repetition( $_, $l );
while( my $r = $iter->next ) {
my $short = join '', @$r;
my $solns = lcss_brute( \$long, \$short, 1 );
next unless defined( $solns );
printf "\rFrom '%s' in '%s'; solns:'%s'\t\t\t", $short, $long, pp $solns;
}
}
}