给定两个字符串A和B,对字符串A进行编辑操作得到字符串B,求最少的编辑操作次数;编辑操作包括:插入,删除和替换,其中每个插入/删除定义为1次编辑操作,每个替换定义为2次编辑操作,替换操作实质为1次插入+1次删除。

上述字符串A定义为source, 字符串B定义为target。

1. How to resolve

设source:play;target: game;

1.1 初始化如下图:

1.2 填充剩余空白矩阵格

填充公式:

其中D[i, j]是1.1中矩阵;

del_cost是指一次删除操作,即del_cost=1;

Ins_cost是指一次插入操作,即ins_cost=1;

rep_cost是指一次替换操作,即rep_cost=2;

src[i]是指source的第i个字母,tar[j]是指target的第j个字母。

1.3 完成矩阵填充/求解

即对字符串“play”进行最少6次“插入”/“删除”操作可以得到字符串“game”:

第一次操作 删除“p”;

第二次操作 插入“g”;

第三次操作 删除“l”;

第四次操作 删除“y”;

第五次操作 插入“m”;

第六次操作 插入“e”。

2 Why does it work

设source:ploy;target: game;

2.1 初始化的意义

2.2 填充矩阵格的意义

字符串“plot”被编辑为字符串“game”,最少需要8次编辑,如下图所示;

按照红色路径0->8,则表示现在字符串“play”前依次插入“g”,“a”,“m”,“e”形成“gameploy”,即0->4的过程;然后再依次删除“p”,“l”,“o”,“y”形成“game”,即5->8的过程。

同理蓝色路径是先依次删除“p”,“l”,“o”,“y”,形成“”,再依次添加“g”,“a”,“m”,“e”;而其它的经过黄色区域的路径,是删除和插入混合进行的过程。

对于source和target中字母完全不同的情况,无论哪条路径最终结果都是一样的,但对于有相同字母的情况,“替换”的2次编辑操作无需操作,导致最短编辑距离是不一样的。

2.3 矩阵及子矩阵的意义

整体矩阵的最后一个元素表示从source字符串到target字符串的最小编辑距离;其中的子矩阵表示子矩阵对应的source字符串到对应的target字符串的最小编辑距离。

其中红色矩阵代表字符串“pla”到字符串“ga”的最小编辑距离为3。

3.代码

import numpy as npdef min_edit_distance(source, target):ins_cost, del_cost, rep_cost = 1, 1, 2m = len(source) n = len(target) D = np.zeros((m+1, n+1), dtype=int) for row in range(1,m+1):D[row,0] = rowfor col in range(1,n+1):D[0,col] = colfor row in range(1,m+1): for col in range(1,n+1):r_cost = [D[row-1,col-1] + rep_cost]if source[row-1] == target[col-1]:r_cost = [D[row-1,col-1]]else:r_cost.append(D[row-1,col] + del_cost)r_cost.append(D[row,col-1] + ins_cost)D[row,col] = np.min(r_cost)cost = D[m, n]return D, costmatrix, cost = min_edit_distance('play', 'game')

字符串插入_动态规划----字符串编辑最小距离相关推荐

  1. 两个字符串,s,t;把t字符串插入到s字符串中,s字符串有足够的空间存放t字符串

    两个字符串,s,t;把t字符串插入到s字符串中,s字符串有足够的空间存放t字符串 void insert(char *s, char *t, int i){char *q = t;char *p =s ...

  2. js 字符串加减法_基于字符串的数值之加减乘除JS算法研究

    在我们的日常js项目中,我们不免会碰到需要进行前端计算的场景.而大家都知道,计算机进行计算时存在精度问题,且数值有值域,偶尔会碰到溢出问题.在最近的一个项目中,由于遇到了一个超过20位的数,因此,又不 ...

  3. 字符串插入_计算机毕业设计中小程序插入html代码

    点击上方"蓝字",关注我们. 一.首先,html 分 2 种情况: 1.做详情页开发的时候发现获取到的数据是 转译后的 html字符串,如下图: 这种 转译后的 html字符串,左 ...

  4. js 字符串插入_前端利器React,为什么推荐JSX来替换JS

    前端框架这几年更新非常快,传统的Boostrap.Jquery已经慢慢退位,现在大行其道的是React和Vue.其中就出身来讲,React来自科技巨头Facebook,似乎更牛逼一点. React 自 ...

  5. vue 组件以字符串插入_今日分享:vue3多层嵌套组件如何访问到最外层组件的数据?...

    我们都知道在vue中父组件向子组件传参需要在组件使用的位置使用属性绑定的方式,然后在子组件中通过props接收父组件中传递过来的数据,如果涉及到多层组件嵌套我们需要涉及到好多次属性绑定和好多次prop ...

  6. python定义字符串数组_从字符串数组(或元组)在Python中创建动态sql“ in list”子句的“最佳”方法是什么?...

    我正在从Python(使用MySQLDb)运行一个动态MySQL查询,该查询包括一个包含字符串值的" in list"子句.执行此功能的函数将获取一个值数组.如果有帮助,我可以将该 ...

  7. java 字符串对齐_最佳字符串对齐的Java实现

    java 字符串对齐 有一阵子,我使用了Levenshtein distance的Apache Commons lang StringUtils实现. 它实现了一些众所周知的技巧,通过仅挂接到两个数组 ...

  8. java字符串排序_对字符串排序持一种宽容的心态

    在Java中一涉及中文处理就会冒出很多问题来,其中排序也是一个让人头疼的课题,我们来看下面的代码: 上面的代码定义一个数组,然后进行升序排序,我们期望的结果是按照拼音升序排列,即为李四.王五.张三,但 ...

  9. java 英文字符串排序_英文字符串排序算法

    编程工作偶尔会遇到一些不常见问题需要处理,学编程处理问题也难免需要熟悉一些算法 以前学习的时候就遇到过一个看似简单的排序算法问题,当时的解决办法是我没有用过的,在此记录一下'' 问题 - 英文字符串排 ...

最新文章

  1. Jan 13 - Bulls and Cows; String; HashSet;
  2. Use Cases in an Agile Backlog
  3. 深拷贝与浅拷贝(mutableCopy与Copy)详解 iOS
  4. php7 fastcgi安装,安装windows 下 php7+nginx+fastcgi
  5. windows环境下Nginx配置
  6. iOS 代码命名规范 及Android 代码命名规范(2)Android
  7. Hexo+Github搭建个人博客(一)——开始搭建
  8. ofd文件电子签章实现方法
  9. 对标TJA1043 SIT1043 带唤醒及故障保护的低功耗CAN FD总线收发器
  10. macbookair有没有touchbar_高配MacBook Air和低配MacBook Pro选哪个?
  11. 论文阅读|用于不同问题的MADDPG算法框架系列论文汇总
  12. 禅道CMS 11.6漏洞
  13. Linux攻关之基础模块十 特殊权限
  14. 在Ubuntu KyLin 16.04上安装g2o
  15. Head First Java 读书笔记(完整)
  16. MySQL | 普通索引和唯一索引,应该怎么选择?
  17. android5.1 MT6735 编译过程
  18. webAPP学习设计:页面模式的设计。
  19. matlab傅里叶工具箱,Matlab傅里叶算法及数字滤波
  20. 2022鹏城杯CTF---Crypto

热门文章

  1. 【bzoj3771】Triple FFT+容斥原理
  2. (转) 服务接口统一返回的格式
  3. 【LeetCode】154. Find Minimum in Rotated Sorted Array II (3 solutions)
  4. 2001年的FLTK设置教程
  5. python---方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法>
  6. 【前端】layui日期控件点击一闪而过解决方法
  7. 在vue项目中:统一封装 Axios 接口与异常处理
  8. Kettle连接HiveServer2配置和常见问题解决
  9. iOS 10、Xcode 8 遇到部分问题解决记录(包括控制台日志不输出)
  10. Invalid byte tag in constant pool: 19 与 javax/el/ELManager问题解决