参考文章:
字符串匹配的KMP算法
PHP
function getNext($str)
{
$len = strlen($str);
$next = [0];
$k = 0;
for ($i = 1; $i < $len; $i++) {
while ($k > 0 && $str[$k] != $str[$i]) {
$k = $next[$k - 1];
}
if ($str[$k] == $str[$i]) {
$k++;
}
$next[$i] = $k;
}
return $next;
}
function kmp($a, $b)
{
$next = getNext($b);
$alen = strlen($a);
$blen = strlen($b);
$k = 0;
for ($i = 0; $i < $alen; $i++) {
while ($k > 0 && $b[$k] != $a[$i]) {
$k = $next[$k - 1];
}
if ($a[$i] == $b[$k]) {
$k++;
}
if ($k == $blen) {
return $i - $blen + 1;
}
}
return -1;
}
$a = 'aacaad';
$b = 'aad';
var_dump(kmp($a, $b));
exit;
GO
package main
import (
"fmt"
)
func main() {
a := "aacaad"
b := "aad"
fmt.Println(kmp(a, b))
}
func kmp(a string, b string) int {
next := getNext(b)
alen := len(a)
blen := len(b)
k := 0
for i := 0; i < alen; i++ {
for {
if k == 0 || a[i] == b[k] {
break
}
k = next[k - 1]
}
if a[i] == b[k] {
k++
}
if k == blen {
return i - blen + 1
}
}
return -1
}
func getNext(str string) []int {
len := len(str)
next := make([]int, len)
k := 0
for i := 1; i < len; i++ {
for {
if k == 0 || str[i] == str[k] {
break
}
k = next[k - 1]
}
if str[i] == str[k] {
k++
}
next[i] = k
}
return next
}