一、题目
二、思路解析
1.思路:
最少操作数——动态数组
res[i][j]:长度为i的字符串转化为长度为j字符串的最少操作
2.常用方法:
无
3.核心逻辑:
1.情况一:当word1为空,word2不为空时
for(int i=0;i<=size2;i++){
res[0][i]=i;
}
2.情况二:word1不为空,word2为空时
for(int i=0;i<=size1;i++){
res[i][0]=i;
}
3.情况三:word1和word2都不为空
a.如果当前二者轮询到的字符是相等的,那么res[i][j]=res[i-1][j-1](两个字符串前一位的一致的最小操作数)
if(word1.charAt(i-1)==word2.charAt(j-1)){
res[i][j]=res[i-1][j-1];
}
b.若当前二者轮询的字符是不相等的,那么来源有2个:
1.字符串都删除当前字符,即res[i-1][j-1]
2.有其中一个字符串删除当前字符 res[i-1][j]或res[i][j-1]
else {
res[i][j]=Math.min(res[i-1][j-1],Math.min(res[i-1][j],res[i][j-1]))+1;
}
三、代码实现
class Solution {
public int minDistance(String word1, String word2) {
int size1=word1.length();
int size2=word2.length();
int[][]res=new int[size1+1][size2+1];
//初始化1.word1为空字符串时,需要经过word2的长度次数才能转化成功
for(int i=1;i<=size2;i++){
res[0][i]=i;
}
//初始化2:word2为空字符串时。需要经过word1的长度次数才能转化成功
for(int i=1;i<=size1;i++){
res[i][0]=i;
}
for(int i=1;i<=size1;i++){
for(int j=1;j<=size2;j++){
if(word1.charAt(i-1)==word2.charAt(j-1)){
res[i][j]=res[i-1][j-1];
}else{
res[i][j]=Math.min(res[i-1][j-1],Math.min(res[i-1][j],res[i][j-1]))+1;
}
}
}
return res[size1][size2];
}
}