Skip to content

Instantly share code, notes, and snippets.

@vhr
Forked from nticaric/BoyerMoore.php
Created October 20, 2015 19:26
Show Gist options
  • Save vhr/b290a9f518215581f72d to your computer and use it in GitHub Desktop.
Save vhr/b290a9f518215581f72d to your computer and use it in GitHub Desktop.
Boyer–Moore algorithm implementation in PHP
<?php
/**
* Returns the index of the first occurrence of the
* specified substring. If it's not found return -1.
*
* @param string
* @param string
* @return int
*/
function BoyerMoore($text, $pattern) {
$patlen = strlen($pattern);
$textlen = strlen($text);
// масив със символите и колко символа има до края на търсения стринг
$table = $this->makeCharTable($pattern);
// прескача през една дължин на търсения стринг
for ($i = $patlen - 1; $i < $textlen;) {
$t = $i;
// идеята на този цикъл е да обхожда в обратен ред (от дясно на ляво), ако стигне до края на търсения стринг връща позицията му
for ($j = $patlen - 1; $pattern[$j] == $text[$i]; $j--, $i--) {
if ($j == 0)
return $i;
}
$i = $t;
// проверява дали имаме съвпадение с някой от символите в стринга
if (array_key_exists($text[$i], $table)) {
$i = $i + max($table[$text[$i]], 1);
} else {
$i += $patlen;
}
}
return -1;
}
function makeCharTable($string) {
$len = strlen($string);
$table = array();
for ($i = 0; $i < $len; $i++) {
$table[$string[$i]] = $len - $i - 1;
}
return $table;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment