Hard!

题目描述:

给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。

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

  1. 插入一个字符
  2. 删除一个字符
  3. 替换一个字符

示例 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')

解题思路:

这道题让求从一个字符串转变到另一个字符串需要的变换步骤,共有三种变换方式,插入一个字符,删除一个字符,和替换一个字符。根据以往的经验,对于字符串相关的题目十有八九都是用动态规划Dynamic Programming来解,这道题也不例外。

这道题我们需要维护一个二维的数组dp,其中dp[i][j]表示从word1的前i个字符转换到word2的前j个字符所需要的步骤。那我们可以先给这个二维数组dp的第一行第一列赋值,这个很简单,因为第一行和第一列对应的总有一个字符串是空串,于是转换步骤完全是另一个字符串的长度。跟以往的DP题目类似,难点还是在于找出递推式,我们可以举个例子来看,比如word1是“bbc",word2是”abcd“,那么我们可以得到dp数组如下:

  Ø a b c d
Ø 0 1 2 3 4
b 1 1 2 3
b 2 2 2 3
c 3 3 2 2

通过观察可以发现,当word1[i] == word2[j]时,dp[i][j] = dp[i - 1][j - 1],其他情况时,dp[i][j]是其左,左上,上的三个值中的最小值加1,那么可以得到递推式为:

dp[i][j] =      /    dp[i - 1][j - 1]                                                                   if word1[i - 1] == word2[j - 1]

\    min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1            else

C++解法一:

 class Solution {
public:
int minDistance(string word1, string word2) {
int n1 = word1.size(), n2 = word2.size();
int dp[n1 + ][n2 + ];
for (int i = ; i <= n1; ++i) dp[i][] = i;
for (int i = ; i <= n2; ++i) dp[][i] = i;
for (int i = ; i <= n1; ++i) {
for (int j = ; j <= n2; ++j) {
if (word1[i - ] == word2[j - ]) {
dp[i][j] = dp[i - ][j - ];
} else {
dp[i][j] = min(dp[i - ][j - ], min(dp[i - ][j], dp[i][j - ])) + ;
}
}
}
return dp[n1][n2];
}
};

最新文章

  1. overview
  2. 图说hibernate注释--java里配置参数(一.1)
  3. RabbitMQ与Redis队列对比
  4. 打造自己的MyLifeOrganized 2(MLO2)云同步
  5. C#处理控制台关闭事件
  6. 抛砖引玉:关于Android的ListView中CheckBox错乱
  7. php 文件缓存
  8. 宙斯是一个完整的Hadoop的作业平台[转]
  9. xhr的send方法以及node如何处理get和post数据
  10. Struts2框架搭建
  11. DotNetCore 定时服务 HangFire
  12. python全栈开发-Day8 函数基础
  13. javascript中词法环境、领域、执行上下文以及作业详解
  14. ASP.NET Core 2 High Performance 目录和读书笔记
  15. [USACO09HOL]假期绘画Holiday Painting
  16. Oracle SQL Developer 调试存储过程步骤(Oracle)
  17. 【安全开发】浅谈JSP安全开发之XSS
  18. 测试中Android与IOS分别关注的点
  19. 【PMP】财务测量指标ROI、PBP、NPV、IRR、BCR
  20. 在iOS开发的Quartz2D使用中实现图片剪切和截屏功能

热门文章

  1. python之接口开发基础知识
  2. basic.js
  3. Navicat for Mysql连接mysql数据库时出现 2003-Can&#39;t connect to MySql server on &#39;localhost&#39;(10061)
  4. BurpSuite使用笔记
  5. 【转】MySQL用户管理及SQL语句详解
  6. Nand
  7. python装饰器的4种类型:函数装饰函数、函数装饰类、类装饰函数、类装饰类
  8. TCP、消息分包和协议设计
  9. java接口可以继承多个接口
  10. 012_k8s专题系列一之进入容器日常op