use strict; use warnings; sub subseqs { my @subseqs = (''); while ($_[0] =~ /(.)/sg) { push @subseqs, map "$_$1", @subseqs; } return \@subseqs; } sub common { my ($list1, $list2) = @_; my %common; for my $i1 (0..$#$list1) { for my $i2 (0..$#$list2) { if ($list1->[$i1] eq $list2->[$i2]) { $common{$list1->[$i1]} = 1; } }} return keys %common; } sub longest { my $longest = shift(@_); for (@_) { if (length($_) > length($longest)) { $longest = $_; } } return $longest; } { my $s1 = 'abdef'; my $s2 = 'abcef'; my $longest = longest(common(subseqs($s1), subseqs($s2))); print("$longest\n"); }