小李的伴学笔记4 | 豆包MarsCode AI刷题

41 阅读3分钟

15.最少前缀操作问题

### 问题描述

小U和小R有两个字符串,分别是SS和TT,现在小U需要通过对SS进行若干次操作,使其变成TT的一个前缀。操作可以是修改SS的某一个字符,或者删除SS末尾的字符。现在你需要帮助小U计算出,最少需要多少次操作才能让SS变成TT的前缀。

解题思路

算法步骤

  1. 比较字符:首先,我们需要比较 S 和 T 在相同长度部分的字符。如果字符不同,则需要进行一次修改操作。
  2. 删除多余字符:如果 S 的长度大于 T 的长度,那么我们需要删除 S 中多余的字符,使其长度与 T 的前缀部分相同。

### 具体步骤

  1. 初始化操作计数器:operations = 0

  2. 计算最小长度:minLength = Math.min(S.length(), T.length())

  3. 遍历相同长度的部分:

    • 如果 S.charAt(i) != T.charAt(i),则 operations++
  4. 处理多余字符:

    • operations += S.length() - minLength

代码

public class Main {
    public static int solution(String S, String T) {
        // write code here
        int operations = 0;
        int minLength = Math.min(S.length(), T.length());
        
        // Compare characters in the common length part
        for (int i = 0; i < minLength; i++) {
            if (S.charAt(i) != T.charAt(i)) {
                operations++; // Increment operations for character modification
            }
        }
        
        // Add operations for deleting extra characters in S
        operations += S.length() - minLength;
        
        return operations;
    }

    public static void main(String[] args) {
        System.out.println(solution("aba", "abb"));
        System.out.println(solution("abcd", "efg"));
        System.out.println(solution("xyz", "xy") );
        System.out.println(solution("hello", "helloworld") );
        System.out.println(solution("same", "same") );
    }
}

25.DNA序列编辑距离

问题描述

小R正在研究DNA序列,他需要一个函数来计算将一个受损DNA序列(dna1)转换成一个未受损序列(dna2)所需的最少编辑步骤。编辑步骤包括:增加一个碱基、删除一个碱基或替换一个碱基。

解题步骤

算法步骤

  1. 初始化:

    • 如果 dna1 为空,那么将 dna1 转换成 dna2 需要 dna2.length() 次增加操作。
    • 如果 dna2 为空,那么将 dna1 转换成 dna2 需要 dna1.length() 次删除操作。
  2. 状态转移:

    • 如果 dna1[i-1] == dna2[j-1],那么 dp[i][j] = dp[i-1][j-1],因为不需要任何编辑操作。

    • 如果 dna1[i-1] != dna2[j-1],那么我们有三种选择:

      • 增加一个碱基:dp[i][j] = dp[i][j-1] + 1
      • 删除一个碱基:dp[i][j] = dp[i-1][j] + 1
      • 替换一个碱基:dp[i][j] = dp[i-1][j-1] + 1
    • 取这三种操作的最小值作为 dp[i][j] 的值。

  3. 最终结果:

    • dp[m][n] 就是将 dna1 转换成 dna2 所需的最少编辑步骤,其中 m 和 n 分别是 dna1 和 dna2 的长度。

感想

动态规划犹如一把精巧的钥匙,能开启复杂问题的优化之门。 每一道动态规划题目都是一场思维的挑战。从寻找最优子结构开始,就如同在迷宫中探寻隐藏的路径,需剖析问题的本质,挖掘出层层嵌套的子问题关系。确定状态转移方程更是关键一步,像是搭建积木的蓝图,精准地描述了如何从已知的子问题答案推导出更大规模问题的解。 在解题时,我深刻体会到了以空间换时间的奇妙之处。通过存储中间结果,避免了大量重复计算,让看似指数级增长的计算量得以有效控制。但这也需要巧妙地平衡空间与时间的开销,避免过度消耗内存。 动态规划不仅是一种编程技巧,更是一种解决问题的智慧。它教会我在面对复杂情境时,冷静地分解难题,逐步构建解决方案,这种思维模式的锻炼将在未来的编程与问题处理中发挥无尽的价值。