导读:本期聚焦于小伙伴创作的《如何在 Java 中利用数组实现简单的最长公共子序列(LCS)动态规划矩阵存储》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在 Java 中利用数组实现简单的最长公共子序列(LCS)动态规划矩阵存储》有用,将其分享出去将是对创作者最好的鼓励。

在 Java 里解决最长公共子序列(LCS)问题时,动态规划是最常用的思路。核心做法是开一个二维数组,用来记录两个字符串前 i 个和前 j 个字符的最长公共子序列长度。这个数组就是动态规划里的“矩阵”,它把每一步的计算结果存起来,避免重复递归。

如何在 Java 中利用数组实现简单的最长公共子序列(LCS)动态规划矩阵存储

为什么用数组存储 LCS 矩阵

如果不存中间结果,用纯递归会出现大量重复计算。用数组当备忘录,每个格子只算一次。二维数组 dp[i][j] 的含义是:字符串 A 的前 i 位与字符串 B 的前 j 位的最长公共子序列长度。

状态转移与数组填充

状态转移规则很简单:

  • 若 A 的第 i 个字符等于 B 的第 j 个字符,则 dp[i][j] = dp[i-1][j-1] + 1
  • 若不相等,则 dp[i][j] = max(dp[i-1][j], dp[i][j-1])

为了处理边界,我们通常把数组开成 (n+1) 行 (m+1) 列,第 0 行和第 0 列初始化为 0。

Java 代码示例

下面是用 Java 数组实现 LCS 矩阵存储与计算的完整例子:

public class LCSArrayDemo {
    public static int lcs(String a, String b) {
        int n = a.length();
        int m = b.length();
        // 定义二维数组作为动态规划矩阵,多开一行一列处理空串情况
        int[][] dp = new int[n + 1][m + 1];

        // 初始化第0行和第0列为0,Java 默认就是0,可省略显式赋值

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (a.charAt(i - 1) == b.charAt(j - 1)) {
                    // 字符相同,左上角加1
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    // 字符不同,取上方或左方较大值
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }
        // 右下角即为最长公共子序列长度
        return dp[n][m];
    }

    public static void main(String[] args) {
        String a = "abcde";
        String b = "ace";
        System.out.println("LCS长度为: " + lcs(a, b));
    }
}

数组存储的注意事项

使用数组存矩阵时,要注意字符串下标从 0 开始,而 dp 数组从 1 开始对应字符位置,所以用 charAt(i-1) 取字符。另外如果字符串很长,二维数组会占较多内存,但在一般题目里完全够用。

通过这种方式,你就用最简单的 Java 数组完成了 LCS 动态规划矩阵的存储与计算,后续也可以基于这个矩阵反向追踪出具体的子序列内容。

JavaLCS动态规划修改时间:2026-07-28 19:12:25

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。