相关标签
一、题目要求
二、题解和代码实现
1.题解
2.代码实现
代码如下(示例):
class Solution {
public int minDistance(String word1, String word2) {
int n = word1.length();
int m = word2.length();
//定义 dp[i][j]表示字符串text1的[1,i]区间和字符串text2的[1,j]区间的最长公共子序列长度(下标从1开始)
int[][] dp = new int[n+1][m+1];//创建动态规划数组,目标是
for (int i = 1; i < dp.length; i++) {
for (int j = 1; j < dp[i].length; j++) {
//1、若text1[i] == text2[j] ,也就是说两个字符串的最后一位相等,
// 那么问题就转化成了字符串text1的[1,j-1]区间和字符串text2的[1,j-1]区间的最长公共子序列长度再加上一,
// 即dp[i][j] = dp[i - 1][j - 1] + 1。(下标从1开始)
if (word1.charAt(i-1) == word2.charAt(j-1)){
dp[i][j] = dp[i-1][j-1]+1;//
}else {
//若text1[i] != text2[j],也就是说两个字符串的最后一位不相等,
// 那么字符串text1的[1,i]区间和字符串text2的[1,j]区间的最长公共子序列长度无法延长,
// 因此f[i][j]就会继承f[i-1][j]与f[i][j-1]中的较大值,
// 即f[i][j] = max(f[i - 1][j],f[i][j - 1]) 。 ( 下标从1开始)
dp[i][j] =Math.max(dp[i][j-1],dp[i-1][j]);
}
}
}
//拿n+m的总字符串长度 -(两个字符串中相同的最长公共子序列*2(因为两个字符串中的相同部分,所以要*2))= 被删除的不同部分的长度
return n+m -dp[n][m]*2;
}
}