OK, this seems to be one way to do it, if I've understood the problem
correctly. No doubt the experts will be along with a slicker way soon...

#!/usr/bin/perl
sub lcs {
    my($l,$off1,$off2,$i,$a,$b);
    local $_;
    for $i(-length($_[0])+1..length($_[1])-1) {
        $a=($i>0)?$_[0]:substr($_[0],-$i);
        $b=($i>0)?substr($_[1],$i):$_[1];
        $_=$a^$b;
        while(/\0+/g) {
            if(length$&>$l){
                $l=length$&;
                $off1=$i;
                $off2=$-[0]
                }
        }
    }
    if ($l == 0) { print("No common substring\n"); }
    else {
        print("Longest common substring of length $l:\n\"");
        print(substr($_[0], ($off1>0)?$off2:$off2-$off1, $l), "\"\n");
        print("Occurring in 1st string at position ",
              (($off1>0)?$off2:$off2-$off1)+1, "\n");
        print("and in 2nd string at position ",
              (($off1>0)?$off2+$off1:$off2)+1, "\n\n");
    }
}

# Testing
lcs("This is one piece of text", "Another piece of text here");
lcs("Another piece of text here", "This is one piece of text");
lcs("bbbbcccbbbd", "dbbbbeeebbbf");
lcs("abbbbcccbbbd", "bbbbeeebbbf");
lcs("aaaabcd", "dfhaaaa");
lcs("dfhaaaa", "aaaabcd");
lcs("abcd", "efgh");

-- 
Stephen Turner, Cambridge, UK    http://homepage.ntlworld.com/adelie/stephen/
"This is Henman's 8th Wimbledon, and he's only lost 7 matches." BBC, 2/Jul/01

Reply via email to