题意:
思路:
我开始是没有思路的 哪怕它是动态规划 还是没有思路,然后看了看b站
果然思路奇特
状态转移方程为:
dp[i][j]=
1:如果当前两个字符串某位置 字符相同 那么无需操作 dp[i][j]=dp[i-1][j-1]
2:如果不等,那么可能要进行增删改 其中一个比如str=edg str2=ef
一个到d 一个到f 那么进行删除操作str=eg
如果进行增加操作 str=efdg
如果进行改操作 str=efg
每一步 都需要走一下, 我们要求的是最小的步骤 那可以
Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i][j-1]));
Math.min(a,b,c);三个不好求最小的时候 可以在min里面再增加一个Math.min
所以状态方程:
if(word1.charAt(i-1)==word2.charAt(j-1)){
dp[i][j]=dp[i-1][j-1];
}else{
dp[i][j]=1+Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i][j-1]));
}
状态初始化:
str=a
str2=apple
a转换为apple 需要走5步,为了方便计算,将数组定义为字符串长度+1 dp[0][0]=0
边上数组 依次+1;
代码:
class Solution {
public int minDistance(String word1, String word2) {
//看了评论解说才知道
int n=word1.length()+1;//行
int m=word2.length()+1;
int[][] dp=new int[n][m];
for(int i=1;i<n;i++) dp[i][0]=i;
for(int j=1;j<m;j++) dp[0][j]=j;
for(int i=1;i<n;i++)
for(int j=1;j<m;j++)
if(word1.charAt(i-1)==word2.charAt(j-1)){
dp[i][j]=dp[i-1][j-1];
}else{
dp[i][j]=1+Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i][j-1]));
}
return dp[n-1][m-1];
}
}