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; } } }