in reply to Pattern Searching
Common pattern in different strings? Using KMP?
I think I solved the corresponding problem on rosalind.info. Here is my solution:
#!/usr/bin/perl use strict; use warnings; sub kmp { my @T = (-1, 0); my ($pos, $cnd) = (2, 0); while ( $pos <= @_ ) { if ($_[$pos-1] eq $_[$cnd]) { $T[$pos++] = ++$cnd } elsif ($cnd > 0) { $cnd = $T[$cnd] // 0 } else { $T[$pos++] = 0 } } shift @T; return @T; } use List::Util qw(max min); sub lcs { my @first = split //, my $first = shift; my $n = @first; my @string = map [ split //, $_ ], @_; my ($pos, $length) = (0, 0); SUFFIX: for my $p ( 0 .. $n - 1 ) { shift @first if $p; my @max; for (@string) { my @kmp = kmp @first, '$', @$_; my $max = max @kmp; next SUFFIX if $max < $length; push @max, $max; } if ((my $min = min @max) > $length) { ($pos, $length) = ($p, $min); } } return substr $first, $pos, $length; } open my $f, '< rosalind_lcs.txt' or die "could not open: $!"; say lcs <$f>;
Hope this will help
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Pattern Searching
by Anonymous Monk on Nov 10, 2012 at 17:31 UTC | |
by aseee (Novice) on Nov 10, 2012 at 18:01 UTC | |
by Anonymous Monk on Nov 11, 2012 at 08:20 UTC |