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的前i个字符转成word的前j个字符所需要的最小步数。这样i,j就用1开始,0作为初始化。

我们来考虑dp[i][j]的计算。将word1的第i个元素表示a,word2的第j个元素表示为b。如果a==b,那么不用操作,进行下个字符遍历,dp[i][j]=dp[i-1][j-1]。如果a!=b,这个时候有三个操作:好好领会。

1、将a变为b。dp[i][j]=dp[i-1][j-1]+1。

2、将b加到a后面,dp[i][j]=dp[i][j-1]+1.//说明前面i个字符可以转成word2的j-1个字符,这时候需要转成j个字符,就得在i个字符后加一个

3、删除a。dp[i][j]=dp[i-1][j]+1.//说明a是多出来的,word1的前i-1个字符就可以转成word2的前j个字符,这里多出来一个只要一步删除就行。

当a.b不相同时,就是取三个步骤的最小值。

dp[i][j]=min(dp[i-1][j-1],dp[i][j-1],dp[i-1][j])+1.

代码:

class Solution {
public int minDistance(String word1, String word2) {
int len1=word1.length();
int len2=word2.length();
//dp[i][j]表示word1的前i个字符转换成word2的前j个字符需要的最小步数。0个字符用于存放初始值
int[][] dp=new int[len1+1][len2+1];
for(int i=0;i<=len1;i++) dp[i][0]=i;//将Word1转成word2的前0个字符,就是删除word1的所有字符,也就是i步操作
for(int j=0;j<=len2;j++) dp[0][j]=j; for(int i=1;i<=len1;i++)
for(int j=1;j<=len2;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-1][j],dp[i][j-1]))+1;
}
} return dp[len1][len2];
}
}

edit distance(编辑距离,两个字符串之间相似性的问题)的更多相关文章

  1. 利用编辑距离(Edit Distance)计算两个字符串的相似度

    利用编辑距离(Edit Distance)计算两个字符串的相似度 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可 ...

  2. ✡ leetcode 161. One Edit Distance 判断两个字符串是否是一步变换 --------- java

    Given two strings S and T, determine if they are both one edit distance apart. 给定两个字符串,判断他们是否是一步变换得到 ...

  3. Edit Distance编辑距离(NM tag)- sam/bam格式解读进阶

    sam格式很精炼,几乎包含了比对的所有信息,我们平常用到的信息很少,但特殊情况下,我们会用到一些较为生僻的信息,关于这些信息sam官方文档的介绍比较精简,直接看估计很难看懂. 今天要介绍的是如何通过b ...

  4. leetCode 72.Edit Distance (编辑距离) 解题思路和方法

    Edit Distance Given two words word1 and word2, find the minimum number of steps required to convert  ...

  5. JS 从一个字符串中截取两个字符串之间的字符串

    /************************************************* 函数说明:从一个字符串中截取 两个字符串之间的字符串 参数说明:src_str 原串, start ...

  6. java string截取两个字符串之间的值

    java string截取两个字符串之间的值 import java.util.regex.Matcher; import java.util.regex.Pattern; public class ...

  7. js截取两个字符串之间的子字符串

    // 截取两个字符串之间的子字符串,返回第一个 function subStringOne(text, begin, end) { var regex; if (end == '\\n') regex ...

  8. js 正则匹配 两个字符串之间,某个字符串之前(之后)的内容

    1.js截取两个字符串之间的内容: var str = "aaabbbcccdddeeefff"; str = str.match(/aaa(\S*)fff/)[1]; alert ...

  9. [LeetCode] Edit Distance 编辑距离

    Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...

随机推荐

  1. python在windows下使用setuptools安装egg文件

    最近和同学做个东西,需要安装python的第三方函数库,看了网上的介绍,很是麻烦,这是我实践总结出来的,希望对大家有用. 以安装第三方库networkx 为例,其余函数库都是一个套路,看完就会滴. 1 ...

  2. HMM:隐马尔可夫模型HMM

    http://blog.csdn.net/pipisorry/article/details/50722178 隐马尔可夫模型 隐马尔可夫模型(Hidden Markov Model,HMM)是统计模 ...

  3. VS2010创建和调用动态链接库

    当我们开发一个产品的时候,我们并不想把源码公布给对方,除了给对方提供exe可执行文件外,我们还可以生成动态链接库,供程序调用,方便二次开发. 下面我将简单梳理一下如何创建和调用动态链接库,方便大家程序 ...

  4. 就这么 来ADO.net类操作数据库

    使用ADO.net操作数据库其实也是很简单,而且使用频率蛮高的一种方式.话不多说,上代码才更容易理解. 首先,先要引入数据库操作相关的命名空间,这样才能使用下面的代码 //数据库连接引用的命名空间 u ...

  5. CUDA学习,环境配置和简单例子

    根据摩尔定律,每18个月,硬件的速度翻一番.纵使CPU的主频会越来越高,但是其核数受到了极大的限制,目前来说,最多只有8个或者9个核.相比之下,GPU具有很大的优势,他有成千上万个核,能完成大规模的并 ...

  6. Chipmunk Rigid Bodies:cpBody

    Chipmunk刚体支持3种不同的类型: Dynamic(动态),Static(静态)以及Kinematic(混合态)刚体.它们拥有不同的行为和性能特征. 动态刚体是默认的刚体类型.它们可以对碰撞做出 ...

  7. leetcode 104 Maximum Depth of Binary Tree二叉树求深度

    Maximum Depth of Binary Tree Total Accepted: 63668 Total Submissions: 141121 My Submissions Question ...

  8. 如何将sqlserver的windows验证模式改为SQL Server 和 Windows 混合身份验证模式

    今天问同事拷贝了份虚拟机,里面已装好sqlserver2008,可是他装的时候选择的是windows身份验证,我需要将其改成SQL Server 和 Windows 混合身份验证模式,具体步骤如下: ...

  9. mysql 好文章

    http://my.oschina.net/OpenSourceBO/blog/353464 http://www.oschina.net/p/cobar mysql集群 http://www.dew ...

  10. iOS雷达图 iOS RadarChart实现

    实现效果 刚拿到设计稿的时候大概看了一眼,当时心里想着放张背景图,然后计算下相应点的坐标,在最上面画一层就OK了,其实一开始实现的时候也确实是这么做的,然后我就日了狗了,发现设计稿上多层五边形的间隔不 ...