Boyer-Moore string search: Difference between revisions

Content added Content deleted
(Added Perl)
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-1) {
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 ($i = $m - 1; $i >= 0 and $pat[$i] eq $txt[$i + $j]; ) { $i-- }
for (; $i >= 0 and $pat[$i] eq $txt[$i + $j]; ) { $i-- }
if ($i < 0) {
if ($i < 0) {
push @I, $j;
push @I, $j;