当前位置:首页 > PHP

PHP实现了LCS

2026-02-16 21:24:31PHP

PHP实现LCS算法

LCS(最长公共子序列)算法用于查找两个序列之间的最长公共子序列。以下是PHP实现LCS的几种方法:

动态规划实现

动态规划是解决LCS问题的经典方法,通过构建二维数组记录子问题的解。

function lcs($str1, $str2) {
    $m = strlen($str1);
    $n = strlen($str2);
    $dp = array_fill(0, $m + 1, array_fill(0, $n + 1, 0));

    for ($i = 0; $i <= $m; $i++) {
        for ($j = 0; $j <= $n; $j++) {
            if ($i == 0 || $j == 0) {
                $dp[$i][$j] = 0;
            } elseif ($str1[$i - 1] == $str2[$j - 1]) {
                $dp[$i][$j] = $dp[$i - 1][$j - 1] + 1;
            } else {
                $dp[$i][$j] = max($dp[$i - 1][$j], $dp[$i][$j - 1]);
            }
        }
    }

    return $dp[$m][$n];
}

递归实现

递归方法虽然简洁,但对于长字符串效率较低。

function lcsRecursive($str1, $str2, $m, $n) {
    if ($m == 0 || $n == 0) {
        return 0;
    }
    if ($str1[$m - 1] == $str2[$n - 1]) {
        return 1 + lcsRecursive($str1, $str2, $m - 1, $n - 1);
    } else {
        return max(
            lcsRecursive($str1, $str2, $m, $n - 1),
            lcsRecursive($str1, $str2, $m - 1, $n)
        );
    }
}

空间优化版本

通过仅保留当前行和上一行的数据来优化空间复杂度。

function lcsOptimized($str1, $str2) {
    $m = strlen($str1);
    $n = strlen($str2);
    $prev = array_fill(0, $n + 1, 0);
    $current = array_fill(0, $n + 1, 0);

    for ($i = 1; $i <= $m; $i++) {
        for ($j = 1; $j <= $n; $j++) {
            if ($str1[$i - 1] == $str2[$j - 1]) {
                $current[$j] = $prev[$j - 1] + 1;
            } else {
                $current[$j] = max($prev[$j], $current[$j - 1]);
            }
        }
        $prev = $current;
    }

    return $current[$n];
}

获取LCS字符串

上述方法仅返回长度,以下代码可返回实际的LCS字符串。

function getLcsString($str1, $str2) {
    $m = strlen($str1);
    $n = strlen($str2);
    $dp = array_fill(0, $m + 1, array_fill(0, $n + 1, 0));

    for ($i = 0; $i <= $m; $i++) {
        for ($j = 0; $j <= $n; $j++) {
            if ($i == 0 || $j == 0) {
                $dp[$i][$j] = 0;
            } elseif ($str1[$i - 1] == $str2[$j - 1]) {
                $dp[$i][$j] = $dp[$i - 1][$j - 1] + 1;
            } else {
                $dp[$i][$j] = max($dp[$i - 1][$j], $dp[$i][$j - 1]);
            }
        }
    }

    $i = $m;
    $j = $n;
    $lcs = '';
    while ($i > 0 && $j > 0) {
        if ($str1[$i - 1] == $str2[$j - 1]) {
            $lcs = $str1[$i - 1] . $lcs;
            $i--;
            $j--;
        } elseif ($dp[$i - 1][$j] > $dp[$i][$j - 1]) {
            $i--;
        } else {
            $j--;
        }
    }

    return $lcs;
}

性能比较

  • 动态规划方法时间复杂度为O(mn),空间复杂度为O(mn)
  • 空间优化版本空间复杂度降为O(n)
  • 递归方法时间复杂度为O(2^(m+n)),仅适合短字符串

这些实现可以用于文本比较、DNA序列分析等场景。根据实际需求选择合适的方法,长字符串推荐使用空间优化版本。

PHP实现了LCS

标签: 实现了PHP
分享给朋友:

相关文章

vue实现了什么功能

vue实现了什么功能

Vue.js 的核心功能 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。它通过以下核心功能简化了前端开发: 响应式数据绑定 Vue 使用基于依赖追踪的响应式系统,当数据变…

PHP http长连接的实现

PHP http长连接的实现

HTTP 长连接基础概念 HTTP长连接(Keep-Alive)允许在单个TCP连接上发送和接收多个HTTP请求/响应,减少重复建立和断开连接的开销。HTTP/1.1默认启用长连接,而HTTP/1.0…

PHP实现图文聊天

PHP实现图文聊天

PHP实现图文聊天的方法 数据库设计 创建数据库表存储聊天消息,包含字段如消息ID、发送者ID、接收者ID、消息内容、消息类型(文本/图片)、发送时间等。使用MySQL或其他数据库管理系统。 CR…

PHP审核流程实现

PHP审核流程实现

PHP审核流程实现方法 审核流程的实现通常涉及状态管理、权限控制和操作记录。以下是几种常见的实现方式: 状态机模式 定义审核状态常量,使用状态机控制流程流转: const STATUS_PEN…

拼团 PHP实现

拼团 PHP实现

拼团功能 PHP 实现 拼团是一种常见的电商营销模式,允许用户邀请好友一起购买商品,达到指定人数后享受优惠价格。以下是使用 PHP 实现拼团功能的关键步骤和代码示例。 数据库设计 拼团功能通常需要设…

PHP中实现重定向

PHP中实现重定向

PHP重定向的实现方法 在PHP中,重定向是通过发送HTTP头信息来实现的。以下是几种常见的重定向方法: 使用header()函数 header("Location: https://exampl…