掘金刷题之路 Day 8 | 豆包MarsCode AI刷题

145 阅读4分钟

古生物DNA序列血缘分析

这个题目是一个很典型的动态规划问题------编辑距离

题目解析:编辑距离问题

题目描述
在豆包MarsCode AI的题库中,我选择了一道经典的动态规划问题——编辑距离问题。其主要目标是计算两个字符串之间的最小变异次数(通过插入、删除或替换操作)。以下是我对这道题的解析:

思路

  • 问题转化:本质是找到将字符串A转化为字符串B所需的最小操作数。
  • 状态定义:使用动态规划,设 dp[i][j] 表示将 A[0:i] 转换为 B[0:j] 的最小操作次数。
  • 状态转移方程
    • 如果 A[i-1] == B[j-1],则 dp[i][j] = dp[i-1][j-1](无操作)。
    • 否则,考虑三种操作:插入、删除、替换,取其中最小值:
  • 初始条件
    • 当一个字符串为空时,另一个字符串需要插入或删除所有字符。
    • dp[0][j] = jdp[i][0] = i

代码实现

public class Main {
    public static int solution(String dna1, String dna2) {
        int n = dna1.length(), m = dna2.length();
        int[][] dp = new int[n + 1][m + 1];

        // 初始化边界
        for (int i = 0; i <= n; i++) dp[i][0] = i;
        for (int j = 0; j <= m; j++) dp[0][j] = j;

        // 填充DP表
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (dna1.charAt(i - 1) == dna2.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1];
                } else {
                    dp[i][j] = Math.min(dp[i - 1][j - 1] + 1, 
                                Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1));
                }
            }
        }

        return dp[n][m];
    }

    public static void main(String[] args) {
        System.out.println(solution("AGT", "AGCT")); // 输出1
    }
}

图解

  1. 构建一个二维DP表,横轴为 dna2,纵轴为 dna1
  2. 填充表格过程中,每个格子存储两字符串的最小操作数。
  3. 结果为表格右下角的值。

知识总结:编辑距离背后的动态规划思想

核心知识点

  1. 动态规划的状态设计
    • 动态规划的关键是明确状态和转移方程。以编辑距离问题为例,状态设计为部分字符串的操作最小值。
  1. 转移方程的推导
    • 根据问题需要,尝试分解每一步操作,并分析其对最优解的贡献。比如插入一个字符是如何影响结果的?
  1. 边界条件的初始化
    • 空字符串和非空字符串的操作次数是这类问题的关键边界条件。

学习建议

  • 初学者建议:从简单的动态规划问题开始,比如斐波那契数列,然后逐步理解复杂的二维DP问题。
  • 总结错题:记录每次出错的状态设计或方程推导问题,避免在类似问题上重复出错。

学习计划:基于豆包MarsCode AI的高效刷题策略

  1. 明确目标
    • 每天完成一定数量的题目,从简单到困难,逐步积累。可以按照题型分类刷题,例如贪心、动态规划、回溯等。
  1. 错题本的使用
    • 将每道错题记录在案,尤其是错在哪里、如何改进。豆包MarsCode AI提供了详细的解析,可以直接作为复习资料。
  1. 利用题目推荐功能
    • 根据薄弱环节,专攻短板。比如我发现动态规划问题易错,便专注于类似的编辑距离问题练习。
  1. 阶段性复盘
    • 每周复盘一次,总结常见问题和优化方法。

工具运用:结合AI与其他学习资源

豆包MarsCode AI的优势

  • 提供自动代码评测,实时反馈结果,帮助高效纠错。
  • 各题目附带详细解析,快速掌握解题思路。
  1. 算法书籍
    • 在遇到瓶颈时,可以参考经典书籍如《算法导论》《编程珠玑》。
  1. 社区交流
    • 参与论坛或学习小组讨论,分享心得,加深理解。

最后

通过豆包MarsCode AI刷题,我掌握了编辑距离等经典动态规划问题的解决方案,同时也总结了一套适合自己的高效学习策略。对初学者而言,制定计划、坚持错题复盘、结合优质资源,是提升刷题能力的不二法门。希望我的经验能够为其他用户提供借鉴,共同进步!