题目大意:给出两个字符串,求出将其中一个变成另一个所需的最小操作数(最小距离),操作有三种——添加、删除、更换一个字符
分析:动规。
状态:dp[i][j]——word1[0]到[i-1]和word2[0]到[j-1]的最小距离
初始化:dp[i][0]=i(因为0~i-1是i个字符,需要在word2插入i个字符,最小距离为i)
dp[0][j]=j(同理)
结果:dp[word1.size()][word2.size()]
状态转移方程:如果word1[i-1]=word2[j-1],dp[i][j]=dp[i-1][j-1](因为不需要任何操作)
如果word1[i-1]!=word2[j-1],dp[i][j]=min{dp[i-1][j],dp[i][j-1],dp[i-1][j-1]}+1({}中分别对应删除word1[i-1]处的字符、在word[i-1]后添加word2[j-1]字符、将word1[i-1]替换成word2[j-1])
代码:转载自https://segmentfault.com/a/1190000010512402
public int minDistance(String word1, String word2) {
if(word1.isEmpty()) return word2.length();
if(word2.isEmpty()) return word1.length();
int[][] steps = new int[word1.length()+1][word2.length()+1];
for(int i = 0 ; i<=word1.length() ; i++){
for(int j = 0 ; j<=word2.length() ; j++){
if(i==0){
steps[i][j] = j;
}else if(j==0){
steps[i][j] = i;
}else if(word1.charAt(i-1) == word2.charAt(j-1)){
steps[i][j] = steps[i-1][j-1];
}else{
steps[i][j] = Math.min(Math.min(steps[i][j-1]+1, steps[i-1][j-1]+1), steps[i-1][j]+1);
}
}
}
return steps[word1.length()][word2.length()];
}