72. 编辑距离

给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

插入一个字符

删除一个字符

替换一个字符

示例 1:

输入:word1 = "horse", word2 = "ros"
输出:3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')

示例 2:

输入:word1 = "intention", word2 = "execution"
输出:5
解释:
intention -> inention (删除 't')
inention -> enention (将 'i' 替换为 'e')
enention -> exention (将 'n' 替换为 'x')
exention -> exection (将 'n' 替换为 'c')
exection -> execution (插入 'u')

思路:由题可知存在最优子结构和重复子问题,因此可以使用动态规划的思路来解决此题,我们使用dp[i][j]来记录word1的前i个字符与word2的前j个字符所使用的最小操作,其操作可以分为两种。

  • 如果word1的第i个字符和word2的第j个字符相等,那么就不需要执行任何操作,因此就可以看成word的前i-1个操作和j-1的操作,即dp[i][j]=d[i-1][j-1]

  • 如果不相等,可以通过插入、删除、替换的方式来解决,具体如下

    • 首先是插入,我们对于word1末尾插入与word2相同的字符,那么此时i的长度加1,因此dp[i][j]=d[i][j-1]+1
    • 然后是删除,选择删除操作删掉word1最末尾的数,删除后两种最末尾数不一定相等,此时我们后续的操作为比较word[i-1]和word[j]字符串即可dp[i][j]=dp[i-1][j]+1
    • 最后为替换,即将word1末尾的字符,替换成和word2末尾字符相等即可,那么在相等后dp[i][j]=d[i-1][j-1]+1

    对于以上三种操作,我们只需要选取操作其中最小的即可dp[i][j]=Math.min(Math.min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;

代码如下所示:

class Solution {
public int minDistance(String word1, String word2) {
int lengthA = word1.length();
int lengthB = word2.length();
if (lengthA * lengthB == 0) {
return lengthA + lengthB;
}
int[][] dp = new int[lengthA+1][lengthB+1];
for(int i=0;i<=lengthA;i++){
dp[i][0] = i;
}
for(int i=0;i<=lengthB;i++){
dp[0][i]=i;
}
for(int i=1;i<=lengthA;i++){
for(int j=1;j<=lengthB;j++){
if(word1.charAt(i-1)==word2.charAt(j-1)){
dp[i][j]=dp[i-1][j-1];
}else{
dp[i][j]=Math.min(Math.min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
}
}
}
return dp[lengthA][lengthB];
}
}

最新文章

  1. 架构师养成记--6.单例和多线程、ThreadLocal
  2. category用法
  3. Learn Spring Framework(continue update...)
  4. JSON上
  5. wget进行整站下载
  6. iOS学习之基本概念
  7. ie6 iframe src=&quot;javascript:&quot; 报安全警报问题
  8. PHP联合sqlserver2008使用的全过程 ( 原创 亲测)
  9. Android性能优化典范 - 第5季
  10. Implement Trie (Prefix Tree) ——LeetCode
  11. android数据储存之应用安装位置
  12. js数组及数组应用(冒泡和二分,遍历输出)
  13. Gradle笔记——构建基础
  14. PHPUnit简介及使用
  15. Leetcode_137_Single Number II
  16. 真机*Appium
  17. 软件发布时的 GA、RC、Beta
  18. springboot整合shiro-登录认证和权限管理
  19. Express 框架
  20. oracle11g的dmp文件导入oracle10g时报错:头部验证失败

热门文章

  1. MySQL 表的创建、复制、修改与删除
  2. Python3+Selenium3自动化测试-(七)
  3. springBoot简单记录日志
  4. CSS 3 所有的选择器整理(2023.2)
  5. *未解决 javaweb登录+验证码 bug存留
  6. 利用Git+GitHub进行团队协作开发
  7. 微信小程序组件封装传值以及问题点规避
  8. nodejs实现保存文件到本地或者服务器
  9. 郁金香 对MFC 编辑框的查看 与更改
  10. mysql怎么设计库、设计表