} /** * @todo kmp算法查找字符串 * @param string @string 目标串 * @param string @pattern 模式串 * @author houweizong@gmail.com * **/ function kmp($string, $pattern) { $next = array(); findNextVal($pattern, $next); $ml = strlen($string); $pl = strlen($pattern); $i = 0; $j = 0; while ($i < $ml - $pl) { while ($j == 0 || $j < $pl && $string[$i] == $pattern[$j]) { $i++; $j++; } if ($j == $pl) { return $i - $pl; } $j = $next[$j]; } return -1; } $pattern = 'abshhh'; $string = 'sssssssssssssssssssababababshhabhshhhabshhhabsabsabs'; $s = kmp($string, $pattern); var_dump($s);
<?php function kmp($arr) { $len = strlen($arr); $k = 0; $next[0] = 0; for ($i = 1; $i < $len; $i++) { if ($k > 0 && $arr[$i] != $arr[$k]) { $k = $next[$k - 1]; } if ($arr[$i] == $arr[$k]) { $k++; } $next[$i] = $k; } return $next; } $arr = 'ababaab'; $arr = kmp($arr); print_r($arr);