in reply to True Brute Force Longest Common Sub Sequence
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.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: True Brute Force Longest Common Sub Sequence
by tachyon-II (Chaplain) on Nov 25, 2007 at 15:50 UTC | |
by ikegami (Patriarch) on Nov 25, 2007 at 18:14 UTC | |
by tachyon-II (Chaplain) on Nov 26, 2007 at 00:31 UTC | |
by ikegami (Patriarch) on Nov 26, 2007 at 06:35 UTC | |
by tachyon-II (Chaplain) on Nov 28, 2007 at 00:06 UTC | |
| |
by ikegami (Patriarch) on Nov 28, 2007 at 01:56 UTC |