15.最少前缀操作问题
### 问题描述
小U和小R有两个字符串,分别是SS和TT,现在小U需要通过对SS进行若干次操作,使其变成TT的一个前缀。操作可以是修改SS的某一个字符,或者删除SS末尾的字符。现在你需要帮助小U计算出,最少需要多少次操作才能让SS变成TT的前缀。
解题思路
算法步骤
- 比较字符:首先,我们需要比较
S和T在相同长度部分的字符。如果字符不同,则需要进行一次修改操作。 - 删除多余字符:如果
S的长度大于T的长度,那么我们需要删除S中多余的字符,使其长度与T的前缀部分相同。
### 具体步骤
-
初始化操作计数器:
operations = 0。 -
计算最小长度:
minLength = Math.min(S.length(), T.length())。 -
遍历相同长度的部分:
- 如果
S.charAt(i) != T.charAt(i),则operations++。
- 如果
-
处理多余字符:
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)所需的最少编辑步骤。编辑步骤包括:增加一个碱基、删除一个碱基或替换一个碱基。
解题步骤
算法步骤
-
初始化:
- 如果
dna1为空,那么将dna1转换成dna2需要dna2.length()次增加操作。 - 如果
dna2为空,那么将dna1转换成dna2需要dna1.length()次删除操作。
- 如果
-
状态转移:
-
如果
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]的值。
-
-
最终结果:
dp[m][n]就是将dna1转换成dna2所需的最少编辑步骤,其中m和n分别是dna1和dna2的长度。
感想
动态规划犹如一把精巧的钥匙,能开启复杂问题的优化之门。 每一道动态规划题目都是一场思维的挑战。从寻找最优子结构开始,就如同在迷宫中探寻隐藏的路径,需剖析问题的本质,挖掘出层层嵌套的子问题关系。确定状态转移方程更是关键一步,像是搭建积木的蓝图,精准地描述了如何从已知的子问题答案推导出更大规模问题的解。 在解题时,我深刻体会到了以空间换时间的奇妙之处。通过存储中间结果,避免了大量重复计算,让看似指数级增长的计算量得以有效控制。但这也需要巧妙地平衡空间与时间的开销,避免过度消耗内存。 动态规划不仅是一种编程技巧,更是一种解决问题的智慧。它教会我在面对复杂情境时,冷静地分解难题,逐步构建解决方案,这种思维模式的锻炼将在未来的编程与问题处理中发挥无尽的价值。