Brute force would involve the following steps:
1. Find all 2n subsequences of s1.
2. Find all 2n subsequences of s2.
3. Find all common subsequences of s1 and s2.
4. Find the longest of the common subsequences.
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"); }
Tested.
Update: Added optimized common as an alternative.
Update: Removed optimized common. It actually reduced the complexity as mentioned below.
In reply to Re: True Brute Force Longest Common Sub Sequence
by ikegami
in thread True Brute Force Longest Common Sub Sequence
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |