当前位置:首页 > PHP

PHP实现了LCS

2026-02-16 21:24:31PHP

PHP实现LCS算法

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

动态规划实现

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

PHP实现了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];
}

递归实现

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

PHP实现了LCS

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
分享给朋友:

相关文章

PHP实现会员管理

PHP实现会员管理

PHP实现会员管理的方法 数据库设计 创建会员表(members)包含字段:id(主键)、username、password(建议加密存储)、email、register_time、last_logi…

PHP接口防重推荐实现

PHP接口防重推荐实现

防重实现方法 使用唯一请求标识符(UUID或业务ID)作为防重依据,客户端每次请求生成唯一标识,服务端校验该标识是否已处理过。适合短时间内的重复请求拦截。 // 客户端生成唯一标识 $request…

PHP实现elm

PHP实现elm

PHP实现ELM(极限学习机) ELM(Extreme Learning Machine)是一种单隐层前馈神经网络算法,具有训练速度快、泛化性能好的特点。以下是PHP实现ELM的关键步骤和代码示例。…

mvc实现 PHP

mvc实现 PHP

MVC 模式概述 MVC(Model-View-Controller)是一种设计模式,用于将应用程序的逻辑分离为三个核心组件:模型(Model)处理数据,视图(View)负责展示,控制器(Contro…

PHP实现OCR

PHP实现OCR

PHP实现OCR的方法 使用PHP实现OCR(光学字符识别)可以通过多种方式完成,以下为几种常见方法: 使用Tesseract OCR Tesseract是一个开源的OCR引擎,支持多种语言。可以通…

PHP 实现aop

PHP 实现aop

PHP 实现 AOP(面向切面编程) AOP(Aspect-Oriented Programming)是一种编程范式,用于将横切关注点(如日志、事务、权限等)从业务逻辑中分离出来。PHP 本身不原生支…