Boyer-Moore string search: Difference between revisions
Content added Content deleted
SqrtNegInf (talk | contribs) (Added Perl) |
SqrtNegInf (talk | contribs) m (→{{header|Perl}}: off-by-one) |
||
Line 485: | Line 485: | ||
sub suffixes ($m,@pat) { |
sub suffixes ($m,@pat) { |
||
my($f,$g) = (0, $m-1); |
my($f, $g) = (0, $m-1); |
||
my @suff = (0) x $m-1; push @suff, $m; |
my @suff = (0) x $m-1; push @suff, $m; |
||
for (my $i = $m-2; $i >= 0; --$i) { |
for (my $i = $m-2; $i >= 0; --$i) { |
||
Line 504: | Line 504: | ||
my @bmGs = ($m) x $m; |
my @bmGs = ($m) x $m; |
||
for my $k (reverse 0..$m- |
for my $k (reverse 0..$m-2) { |
||
if ($suff[$k] == $k + 1) { |
if ($suff[$k] == $k + 1) { |
||
for (my $j=0; $j < $m-1-$k; $j++) { $bmGs[$k]=$m-1-$k if $bmGs[$j] == $m } |
for (my $j=0; $j < $m-1-$k; $j++) { $bmGs[$k]=$m-1-$k if $bmGs[$j] == $m } |
||
Line 524: | Line 524: | ||
my @I; |
my @I; |
||
while ($j <= $n - $m) { |
while ($j <= $n - $m) { |
||
my $i; |
my $i = $m - 1; |
||
for ( |
for (; $i >= 0 and $pat[$i] eq $txt[$i + $j]; ) { $i-- } |
||
if ($i < 0) { |
if ($i < 0) { |
||
push @I, $j; |
push @I, $j; |