LeetCode—72. Edit Distance
题目
https://leetcode.com/problems/edit-distance/description/
NLP中的文本编辑距离问题。将字符串word1转换为word2最小需要几步,只能使用插入、删除、替换三种操作。
思路及解法
对于字符串处理的问题,十有八九是动态规规划的问题,这道题也是。
维护一个二维数组dp[i][j]表示word1的前i个字符变换到word2的前j个字符所需要的变换次数。
再来考虑递推关系。如何变换到dp[i][j]呢?根据三种操作,有三种情况:
1.从dp[i-1][j-1]开始,如果word1[i]==word2[j],那么不需要进行操作,如果不相等,那么就进行一次替换操作就可以。
2.从dp[i-1][j]开始,要到dp[i][j],注意因为是递推关系,所以dp[i-1][j]已经是成立的了,所以只需要进行一次删除操作
3.与2相似,从dp[i][j-1]开始,只需进行一次插入操作。
总结下来就行下面的逻辑:
形象化的二维数组如下图:
代码
class Solution {
public int minDistance(String word1, String word2) {
int len1 = word1.length();
int len2 = word2.length();
if(len1 == 0) return len2;
if(len2 == 0) return len1;
int[][] dp = new int[len1+1][len2+1];
for(int i=0; i<=len1; i++){
dp[i][0] = i;
}
for(int j=0; j<=len2; j++){
dp[0][j] = j;
}
for(int i=1; i<=len1; i++){
for(int j=1; j<=len2; j++){
if(word1.charAt(i-1)==word2.charAt(j-1)){
dp[i][j] = dp[i-1][j-1];
}else{
dp[i][j]=Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1]))+1;
}
}
}
return dp[len1][len2];
}
}