题解 | #编辑距离(一)#
编辑距离(一)
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]; } }