LeetCode--72. 编辑距离(java)

原题链接
动态规划
dp[i][j] 表示 word1 中 0 到 i 的子串 和 word2 中的 0 到 j 的子串 的最小编辑距离。
i 表示word1的下标,j 表示word2 的下标

dp方程:
dp[i][j] 怎么推?分两种情况:

  • 当前两字符相等,即 word1[i] = word2[j]
    则 dp[i][j] = dp[i-1][j-1]

  • 当前两个字符不相等,即 word1[i] != word2[j]
    则 dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])

    不相等时具体又有两种情况:
    第一种:word1当前子串长度 = word2当前子串长度
    比如:word1:ac c 和 word2: ad b,当前两个字符cb不相等,则dp[i][j]的结果就等于 ac 与 ad 的最小编辑距离再加 1 次替换操作,所以 dp[i][j] = dp[i-1][j-1] + 1(替换) 。
    第二种:word1当前子串长度 != word2当前子串长度
    则 dp[i][j] 就等于 word1[0 到 i-1] 与 word2[0 到 j-1] 这两个子串的最小编辑距离 + 1 次删除操作
    比如:word1:acsdfdsc c 和 word2: adfgh b(当前word1子串长度 > word2子串),当前两个字符cb不相等,删除word1的 c,所以 dp[i][j] = 1(删除word1的 c) + dp[i-1][j]
    再比如:word1:dsc c 和 word2: adfgh b(当前word1子串长度 < word2子串),当前两个字符cb不相等,删除word2的 b,所以 dp[i][j] = 1(删除word2的 b) + dp[i][j-1]

      综上,当前两个字符不相等时,就可以统一为dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])
    
class Solution {
    public int minDistance(String word1, String word2) {
        int m = word1.length();
		int n = word2.length();
		if(m * n == 0) return n + m;
		int[][] dp = new int[m + 1][n + 1];
		//初始化dp
		for(int i = 0;i <= m;i++) dp[i][0] = i;//初始化第一列
		for(int j = 0;j <= n;j++) dp[0][j] = j;//初始化第一行
		for(int i = 1;i <= m;i++) {
			for(int j = 1;j <= n;j++) {
				if(word1.charAt(i - 1) == word2.charAt(j - 1)) {
					dp[i][j] = dp[i - 1][j - 1];
				}else {
					int mid = Math.min(dp[i - 1][j - 1], dp[i - 1][j]);
					int min = Math.min(mid, dp[i][j - 1]);
					dp[i][j] = 1 + min;
				}
			}
		}
		return dp[m][n];
    }
}

在这里插入图片描述
dp[i][0]表示 word1当前子串 word1[0 到 i - 1] 与 空字符串的最小编辑距离,也就是当前子串的长度
dp[0][j]表示 word2当前子串 word2[0 到 j - 1] 与 空字符串的最小编辑距离,也就是当前子串的长度

发布了48 篇原创文章 · 获赞 4 · 访问量 2951

猜你喜欢

转载自blog.csdn.net/QinLaoDeMaChu/article/details/104061134