描述
给定两个字符串 str1 和 str2 ,请你算出将 str1 转为 str2 的最少操作数。
你可以对字符串进行3种操作:
1.插入一个字符
2.删除一个字符
3.修改一个字符。

字符串长度满足 1≤n≤1000 1 \le n \le 1000 \ 1≤n≤1000 ,保证字符串中只出现小写英文字母。
示例1

输入:“nowcoder”,“new”
返回值: 6
说明: “nowcoder”=>“newcoder”(将’o’替换为’e’),修改操作1次 “nowcoder”=>“new”(删除"coder"),删除操作5次

示例2

输入: “intention”,“execution”
返回值: 5
说明:
一种方案为: 因为2个长度都是9,后面的4个后缀的长度都为"tion",于是从"inten"到"execu"逐个修改即可

示例3

输入: “now”,“nowcoder”
返回值: 5

思路:

把第一个字符串变成第二个字符串,我们需要逐个将第一个字符串的子串最少操作下变成第二个字符串,这就涉及了第一个字符串增加长度,状态转移,那可以考虑动态规划。用dp[i][j]表示从两个字符串首部各自到str1[i]和str2[j]为止的子串需要的编辑距离,那很明显dp[str1.length][str2.length]就是我们要求的编辑距离。(下标从1开始)

具体做法:

step 1:初始条件: 假设第二个字符串为空,那很明显第一个字符串子串每增加一个字符,编辑距离就加1,这步操作是删除;同理,假设第一个字符串为空,那第二个字符串每增加一个字符,编剧距离就加1,这步操作是添加。
step 2:状态转移: 状态转移肯定是将dp矩阵填满,那就遍历第一个字符串的每个长度,对应第二个字符串的每个长度。如果遍历到str1[i]和 str2[j]的位置,这两个字符相同,这多出来的字符就不用操作,操作次数与两个子串的前一个相同,因此有dp[i][j]=dp[i−1][j−1];如果这两个字符不相同,那么这两个字符需要编辑,但是此时的最短的距离不一定是修改这最后一位,也有可能是删除某个字符或者增加某个字符,因此我们选取这三种情况的最小值增加一个编辑距离,即dp[i][j]=min(dp[i−1][j−1],min(dp[i−1][j],dp[i][j−1]))+1
import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param str1 string字符串* @param str2 string字符串* @return int整型*/public int editDistance (String str1, String str2) {// write code here//1定义整型n1、n2获取str1、str2的长度int n1 = str1.length();int n2 = str2.length();//2.dp[i][j]表示str1[i]和str2[j]为止的子串需要的编辑距离int[][] dp = new int[n1 + 1][n2 + 1];//3.初始化边界(横向和纵向)for (int i = 1; i <= n1; i++)dp[i][0] = dp[i - 1][0] + 1;for (int i = 1; i <= n2; i++)dp[0][i] = dp[0][i - 1] + 1;//4.遍历第一个字符串的每个位置for (int i = 1; i <= n1; i++)//5.对应第二字字符串每个位置for (int j = 1; j <= n2; j++) {//6.若是字符相同,此处不用编辑if (str1.charAt(i - 1) == str2.charAt(j - 1))//7.直接等于二者前一个距离dp[i][j] = dp[i - 1][j - 1];//8.或者else//9.选取最小的距离加上此处编辑距离1dp[i][j] = Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i][j - 1])) + 1;}//10.最后返回dpreturn dp[n1][n2];}
}

26.编辑距离(一)相关推荐

  1. 【转】中国行政区域(县区级带坐标经纬度)

    这是整理的一份行政区域js脚本,可以拿来做省市县三级联动,并加载地图到页面上,参考案例,了解更多. var areas = [ {"code":"110000" ...

  2. Levenshtein distance 编辑距离算法

    这几天再看 virtrual-dom,关于两个列表的对比,讲到了 Levenshtein distance 距离,周末抽空做一下总结. Levenshtein Distance 介绍 在信息理论和计算 ...

  3. (DP)51NOD 1183 编辑距离

    编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除 ...

  4. 最短编辑距离 python_最短编辑距离算法实现

    一,算法介绍 在CS124课程的第一周提到 求解两个字符串相似度的算法---Minimum Edit Distance(最短编辑距离)算法.该算法在NLP(自然语言处理)中也会用到. 如何定义相似度呢 ...

  5. 递归c语言字符串最小编辑距离,算法设计与分析-编辑距离问题

    一.实践题目 设A和B是2个字符串.要用最少的字符操作将字符串A转换为字符串B.这里所说的字符操作包括 (1)删除一个字符: (2)插入一个字符: (3)将一个字符改为另一个字符. 将字符串A变换为字 ...

  6. HDU 4323 Magic Number(编辑距离DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=4323 题意: 给出n个串和m次询问,每个询问给出一个串和改变次数上限,在不超过这个上限的情况下,n个串中有多少个 ...

  7. 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

    最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列.比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大:而 {5,-6,4,2}的最大子序列是{4, ...

  8. ElasticSearch 2 (26) - 语言处理系列之打字或拼写错误

    ElasticSearch 2 (26) - 语言处理系列之打字或拼写错误 摘要 我们喜欢在对结构化数据(如:日期和价格)做查询时,结果只返回那些能精确匹配的文档.但是,好的全文搜索不应该有这样的限制 ...

  9. 动态规划最常见的习题 (最长公共子串、最长公共子序列、最短编辑距离)

    (1)理论部分: (2)习题: 最长公共子串: 1 package month7.dp; 2 3 //https://www.nowcoder.com/questionTerminal/181a1a7 ...

最新文章

  1. DS18B20 理解与操作源码
  2. anaconda使用方法
  3. 谷歌最新财报:平均每天入账5个亿,还是不及预期;皮猜:未来靠云+AI
  4. Go: GoRoutine是如何实现的?
  5. Netty系列之一开始使用
  6. 获取json对象的长度
  7. 【Python】Windows下Python3虚拟环境搭建
  8. 模块化解耦框架RxFluxArchitecture3-订阅管理绑定生命周期
  9. 隐藏input的光标
  10. assume用法及意思_assume的用法和例句
  11. 转载一篇JAVA面试题
  12. 目前最火热的创新创业项目有哪些?
  13. 2018国赛数学建模B题一道工序代码
  14. EMC设计理论通俗非科班学习笔记(完结)
  15. 短期学习目标2022/3/16
  16. (转载)如何写论文之标题篇
  17. centos7搭建开源ERP-PSI
  18. 已解决SyntaxError:expected ‘:‘
  19. 在AS中引用第三方java类库含源代码包
  20. 树立产学研合作典范,IBM携手十所商学院共同打造百企大数据合作计划A100升级版...

热门文章

  1. Excel 文本转数值的方法
  2. Java猫和狗(继承,多态,抽象,接口版)上
  3. 杂记-2018.04.09
  4. 服务器操找不见系统,服务器提示找不到操作系统
  5. C++中的常函数和常对象
  6. 如何做好积分商城运营?
  7. 计算机无法屏保,电脑屏幕保护程序为什么不能修改 原因及解决方法【详细介绍】...
  8. css之@media网页适配
  9. 如何设置u盘写保护防止u盘拷贝文件
  10. 【微信转账—设置付款时间问题】