当前位置:首页 > PHP

php实现kmp

2026-01-30 03:59:18PHP

KMP算法简介

KMP算法是一种高效的字符串匹配算法,由Knuth、Morris和Pratt共同提出。该算法通过预处理模式串生成部分匹配表(Partial Match Table),利用已匹配信息减少不必要的比较次数,时间复杂度为O(n+m)。

php实现kmp

PHP实现KMP算法

构建部分匹配表(PMT)

部分匹配表记录模式串前缀与后缀的最长公共长度。对于模式串$pattern,其PMT构建代码如下:

php实现kmp

function computeLPSArray($pattern) {
    $len = 0;
    $lps = [0];
    $i = 1;
    $M = strlen($pattern);

    while ($i < $M) {
        if ($pattern[$i] == $pattern[$len]) {
            $len++;
            $lps[$i] = $len;
            $i++;
        } else {
            if ($len != 0) {
                $len = $lps[$len - 1];
            } else {
                $lps[$i] = 0;
                $i++;
            }
        }
    }
    return $lps;
}

KMP搜索实现

利用PMT进行字符串匹配,跳过已确认不匹配的部分:

function KMPSearch($pattern, $text) {
    $M = strlen($pattern);
    $N = strlen($text);
    $lps = computeLPSArray($pattern);
    $i = $j = 0;

    while ($i < $N) {
        if ($pattern[$j] == $text[$i]) {
            $i++;
            $j++;
        }
        if ($j == $M) {
            echo "Found pattern at index " . ($i - $j) . "\n";
            $j = $lps[$j - 1];
        } elseif ($i < $N && $pattern[$j] != $text[$i]) {
            if ($j != 0) {
                $j = $lps[$j - 1];
            } else {
                $i++;
            }
        }
    }
}

使用示例

$text = "ABABDABACDABABCABAB";
$pattern = "ABABCABAB";
KMPSearch($pattern, $text);
// 输出:Found pattern at index 10

关键点说明

  • PMT构建:通过比较前缀和后缀确定最长公共长度,避免重复比较。
  • 搜索优化:当字符不匹配时,根据PMT跳过已知匹配部分,减少回溯次数。
  • 时间复杂度:预处理阶段O(m),搜索阶段O(n),优于暴力匹配的O(n*m)。

注意事项

  • 模式串和文本需为单字节字符(如ASCII),多字节字符(如UTF-8)需额外处理。
  • 实际应用中可封装为类,增加偏移量参数等扩展功能。

标签: phpkmp
分享给朋友:

相关文章

php 路由实现

php 路由实现

PHP 路由实现方法 在 PHP 中实现路由功能有多种方式,以下是几种常见的实现方法: 使用原生 PHP 实现 通过解析 URL 并匹配对应的控制器和动作: $request = $_SERVER…

php实现排序

php实现排序

PHP 数组排序方法 PHP 提供了多种内置函数用于数组排序,适用于不同的排序需求。以下是常见的排序方法: 按值升序排序 sort() 函数对数组按值升序排序,重置键名(索引数组适用): $num…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…

php实现文件的下载

php实现文件的下载

PHP 实现文件下载的方法 在 PHP 中实现文件下载功能通常需要设置正确的 HTTP 头信息,并输出文件内容。以下是几种常见的实现方式: 使用 header() 函数强制下载 通过设置 Conte…

php队列的实现

php队列的实现

PHP队列的实现方式 PHP中实现队列功能可以通过多种方式,根据需求选择适合的方案: 使用数组实现基础队列 PHP数组本身支持队列操作,利用array_push和array_shift函数: $q…