当前位置:首页 > 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 单例模式的实现步骤 私有化构造函数…

PHP中实现重定向

PHP中实现重定向

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

域名转短域名PHP实现

域名转短域名PHP实现

短域名服务的基本原理 短域名服务通过将长URL映射到更短的唯一字符串实现跳转。核心步骤包括生成短码、存储原始URL与短码的对应关系、通过短码重定向到原始URL。 生成短码的常见方法 Base62编码…

PHP实现numpy

PHP实现numpy

在PHP中实现类似NumPy的功能,可以通过结合PHP的数组操作、扩展库或第三方工具来模拟部分功能。以下是几种常见方法: 使用PHP数组和内置函数 PHP的数组支持多维操作,结合内置数学函数可实现基…

PHP实现excel

PHP实现excel

PHP 实现 Excel 操作 读取 Excel 文件 使用 PHP 读取 Excel 文件可以通过 PhpSpreadsheet 库实现。安装该库可以通过 Composer: composer r…

PHP实现markdown

PHP实现markdown

实现Markdown解析的基本方法 PHP中有多种方式可以实现Markdown解析功能,包括使用现有库、自定义解析器或结合前端工具。以下是几种常见的方法: 使用Parsedown库 Parsedow…