【leetcode刷题笔记】Edit Distance
Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)
You have the following 3 operations permitted on a word:
a) Insert a character
b) Delete a character
c) Replace a character
题解:动态规划问题。
用数组dp[i][j]表示从word1[0,i]变换到word2[0,j]所需要的最小变换。
那么dp[i][j] = word1(i) == word2(j)? dp[i-1][j-1]: min(dp[i-1,j], dp[i,j-1], dp[i-1,j-1])+1;
要特别注意的是第一行和第一列的处理问题。一种方法是把dp的大小设置为dp[word1.length+1][word2.length+1],然后dp[0][i] = dp[i][0] = i,表示从空字符串变换到长度为i的字符串相互变换至少需要i步。个人觉得这是比较好的一种方法,但是当时没有想到。
我想到的是另外 一种方法,而且在这里被坑了好久。以行为例: dp[0][i] = Math.max(dp[0][i-1] + (wordchars1[0]== wordchars2[i]?0:1),i); 表示如果word1的第0个字符和word2的第i个字符相等,那么需要dp[0][i-1]步变换。但是这里有个问题,就是当word1 = "pneumu", word2 = "up"的时候,此时从字符串"u"变换到"pneum"需要4步,在计算从"u"变换到"pneumu"的时候,如果直接用dp[0][i-1]得到需要4步,但这是不可能的,因为两个字符串的长度就相差了5,至少需要5步,所以才有了外面的max函数判断,两个字符串互相转换的最少步数不会低于两个字符串长度之差。
最终代码如下:
public class Solution {
public int minDistance(String word1, String word2) {
int m = word1.length();
int n = word2.length();
if(m == 0)
return n;
if(n == 0)
return m;
int[][] dp = new int[m][n]; char[] wordchars1 = word1.toCharArray();
char[] wordchars2 = word2.toCharArray(); dp[0][0] = wordchars1[0] == wordchars2[0]?0:1;
for(int i = 1;i < n;i++)
dp[0][i] = Math.max(dp[0][i-1] + (wordchars1[0]== wordchars2[i]?0:1),i);
for(int i = 1;i < m;i++)
dp[i][0] = Math.max(dp[i-1][0] + (wordchars1[i]== wordchars2[0]?0:1),i); for(int i = 1;i < m;i++){
for(int j = 1;j < n;j++){
if(wordchars1[i] == wordchars2[j] )
dp[i][j] = dp[i-1][j-1];
else{
dp[i][j] = 1 + Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i][j-1]));
}
}
} return dp[m-1][n-1];
}
}
【leetcode刷题笔记】Edit Distance的更多相关文章
- LintCode刷题笔记-- Edit distance
标签:动态规划 描述: Given two words word1 and word2, find the minimum number of steps required to convert wo ...
- LeetCode刷题笔记和想法(C++)
主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...
- 18.9.10 LeetCode刷题笔记
本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...
- LeetCode刷题笔记 - 12. 整数转罗马数字
学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...
- 刷题72. Edit Distance
一.题目说明 题目72. Edit Distance,计算将word1转换为word2最少需要的操作.操作包含:插入一个字符,删除一个字符,替换一个字符.本题难度为Hard! 二.我的解答 这个题目一 ...
- Leetcode刷题笔记(双指针)
1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ...
- LeetCode刷题笔记(1-9)
LeetCode1-9 本文更多是作为一个习题笔记,没有太多讲解 1.两数之和 题目请点击链接 ↑ 最先想到暴力解法,直接双循环,但是这样复杂度为n平方 public int[] twoSum(int ...
- leetcode刷题笔记
(1)Best Time to Buy and Sell Stock Total Accepted: 10430 Total Submissions: 33800My Submissions Say ...
- leetcode刷题笔记08 字符串转整数 (atoi)
题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...
随机推荐
- 使用Maven整合SSH总结
本人自己进行的SSH整合,中间遇到不少问题,特此做些总结,仅供参考. 项目环境: struts-2.3.31 + spring-4.3.7 + hibernate-4.2.21 + maven-3.3 ...
- mysql 语句要求
mysql 语句不可以有单引号,要把单引号替换为双引号!
- CSS实现绝对定位居中
我们经常用margin:0 auto来实现水平居中,而一直认为margin:auto不能实现垂直居中……实际上,实现垂直居中仅需要声明元素高度和下面的CSS: .Absolute-Center { m ...
- mysql中的for update
Select…For Update语句的语法与select语句相同,只是在select语句的后面加FOR UPDATE [NOWAIT]子句. 该语句用来锁定特定的行(如果有where子句,就是满足w ...
- sql server 集群配置
Windows server2003 + sql server2005 集群配置安装 一:环境 软硬件环境 虚拟3台windows server 2003主机.当中一台做域控DC,另外两台作为节点wi ...
- android open source
https://github.com/Cleveroad https://github.com/ddwhan0123/Useful-Open-Source-Android https://github ...
- hdu 2349 最小生成树
/* 刚開始想错了,我以为必须是相邻的点才干连接.原来无线距离能够随意连接 对最小生成树理解不够深啊 */ #include<stdio.h> #include<math.h> ...
- unittest 单元测试框架
引入 unittest 框架 相想使用unittest 框架,首先要引入unittest 包 import unittest class Baidu(unittest.TestCase): Baidu ...
- 快速搭建一个成熟,强壮的App框架【转载】
App框架搭建 招聘信息: iOS 研发工程师 iOS开发工程师 iOS开发实习工程师 新浪微博-Android开发工程师&iOS开发工程师 美术设计师(2D) UI设计师 cocos2dx手 ...
- Highways - poj 2485 (Prim 算法)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 24383 Accepted: 11243 Description T ...