题解 | #编辑距离(一)#
编辑距离(一)
https://www.nowcoder.com/practice/6a1483b5be1547b1acd7940f867be0da
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str1 string字符串
* @param str2 string字符串
* @return int整型
*/
/**
思路 使用二维dp[i][j] 表示str1[i]到str2[j] 要编辑多少步
然后循环遍历
如果str1[i] == str2[j] 表示该步骤不需要编辑dp[i-1][j-1] == dp[i][j]
如果str1[i] != str2[j]
(都化为删除操作)
1.str1做删除操作或str2做添加操作
dp[i][j] = dp[i-1][j] + 1
2.str1做添加操作或str2做删除操作
dp[i][j] = dp[i][j-1] + 1
3.str1做修改操作 或 str2做修改操作 是先删除后添加 或者先添加后删除
dp[i][j] = dp[i-1][j-1] +1
*/
public int editDistance (String str1, String str2) {
// write code here
int n = str1.length();
int m = str2.length();
int dp[][] = new int[n+1][m+1]; //多开一个的原因 其中一个字符串为空串时
//初始化二维dp
//当 str2 为空串时
for(int i = 0 ; i <= n ; i++){
dp[i][0] = i;
}
//当 str1 为空串时
for(int i = 0 ; i <= m ; i++){
dp[0][i] = i;
}
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= m ; j++){
if(str1.charAt(i-1) == str2.charAt(j-1)){
dp[i][j] = dp[i - 1][ j - 1];
}else{
//求最少操作数
dp[i][j] = Math.min(dp[i-1][j],Math.min(dp[i][j-1],dp[i-1][j-1])) + 1;
}
}
}
return dp[n][m];
}
}

