KMP - Single pattern string matching

Reference article:
KMP string matching algorithm

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
}

Guess you like

Origin blog.csdn.net/ttth835/article/details/94576309