动态规划之编辑距离
原创
©著作权归作者所有:来自51CTO博客作者小傻孩丶的原创作品,请联系作者获取转载授权,否则将追究法律责任
编辑距离这道题本质上也是遍历所有问题分支的题目,他有三个选择,插入删除替换
dp[i][j] 这个定义代表 前i个字匹配前j个字符对应的编辑距离
dp[i][j-1] +1 代表 ,在word2后增加一个字符,word1前i个字符转换到word2前j个字符的距离为dp[i][j-1]+1 。这是word2增,
dp[i-1][j]+1 代表 word2 删除
dp[i-1][j-1]+1 替换
/**
* <p>给你两个单词 <code>word1</code> 和 <code>word2</code>, <em>请返回将 <code>word1</code> 转换成 <code>word2</code> 所使用的最少操作数</em> 。</p>
*
* <p>你可以对一个单词进行如下三种操作:</p>
*
* <ul>
* <li>插入一个字符</li>
* <li>删除一个字符</li>
* <li>替换一个字符</li>
* </ul>
*
* <p> </p>
*
* <p><strong>示例 1:</strong></p>
*
* <pre>
* <strong>输入:</strong>word1 = "horse", word2 = "ros"
* <strong>输出:</strong>3
* <strong>解释:</strong>
* horse -> rorse (将 'h' 替换为 'r')
* rorse -> rose (删除 'r')
* rose -> ros (删除 'e')
* </pre>
*
* <p><strong>示例 2:</strong></p>
*
* <pre>
* <strong>输入:</strong>word1 = "intention", word2 = "execution"
* <strong>输出:</strong>5
* <strong>解释:</strong>
* intention -> inention (删除 't')
* inention -> enention (将 'i' 替换为 'e')
* enention -> exention (将 'n' 替换为 'x')
* exention -> exection (将 'n' 替换为 'c')
* exection -> execution (插入 'u')
* </pre>
*
* <p> </p>
*
* <p><strong>提示:</strong></p>
*
* <ul>
* <li><code>0 <= word1.length, word2.length <= 500</code></li>
* <li><code>word1</code> 和 <code>word2</code> 由小写英文字母组成</li>
* </ul>
* <div><div>Related Topics</div><div><li>字符串</li><li>动态规划</li></div></div><br><div><li>👍 2458</li><li>👎 0</li></div>
*/
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int minDistance(String word1, String word2) {
int m = word1.length();
int n = word2.length();
int[][] dp = new int[m+1][n+1];
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 {
dp[i][j] = Math.min(dp[i - 1][j] + 1, Math.min(dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1));
}
}
}
return dp[m][n];
}
}
//leetcode submit region end(Prohibit modification and deletion)