字符串插入_动态规划----字符串编辑最小距离
给定两个字符串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')
字符串插入_动态规划----字符串编辑最小距离相关推荐
- 两个字符串,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 ...
- js 字符串加减法_基于字符串的数值之加减乘除JS算法研究
在我们的日常js项目中,我们不免会碰到需要进行前端计算的场景.而大家都知道,计算机进行计算时存在精度问题,且数值有值域,偶尔会碰到溢出问题.在最近的一个项目中,由于遇到了一个超过20位的数,因此,又不 ...
- 字符串插入_计算机毕业设计中小程序插入html代码
点击上方"蓝字",关注我们. 一.首先,html 分 2 种情况: 1.做详情页开发的时候发现获取到的数据是 转译后的 html字符串,如下图: 这种 转译后的 html字符串,左 ...
- js 字符串插入_前端利器React,为什么推荐JSX来替换JS
前端框架这几年更新非常快,传统的Boostrap.Jquery已经慢慢退位,现在大行其道的是React和Vue.其中就出身来讲,React来自科技巨头Facebook,似乎更牛逼一点. React 自 ...
- vue 组件以字符串插入_今日分享:vue3多层嵌套组件如何访问到最外层组件的数据?...
我们都知道在vue中父组件向子组件传参需要在组件使用的位置使用属性绑定的方式,然后在子组件中通过props接收父组件中传递过来的数据,如果涉及到多层组件嵌套我们需要涉及到好多次属性绑定和好多次prop ...
- python定义字符串数组_从字符串数组(或元组)在Python中创建动态sql“ in list”子句的“最佳”方法是什么?...
我正在从Python(使用MySQLDb)运行一个动态MySQL查询,该查询包括一个包含字符串值的" in list"子句.执行此功能的函数将获取一个值数组.如果有帮助,我可以将该 ...
- java 字符串对齐_最佳字符串对齐的Java实现
java 字符串对齐 有一阵子,我使用了Levenshtein distance的Apache Commons lang StringUtils实现. 它实现了一些众所周知的技巧,通过仅挂接到两个数组 ...
- java字符串排序_对字符串排序持一种宽容的心态
在Java中一涉及中文处理就会冒出很多问题来,其中排序也是一个让人头疼的课题,我们来看下面的代码: 上面的代码定义一个数组,然后进行升序排序,我们期望的结果是按照拼音升序排列,即为李四.王五.张三,但 ...
- java 英文字符串排序_英文字符串排序算法
编程工作偶尔会遇到一些不常见问题需要处理,学编程处理问题也难免需要熟悉一些算法 以前学习的时候就遇到过一个看似简单的排序算法问题,当时的解决办法是我没有用过的,在此记录一下'' 问题 - 英文字符串排 ...
最新文章
- Jan 13 - Bulls and Cows; String; HashSet;
- Use Cases in an Agile Backlog
- 深拷贝与浅拷贝(mutableCopy与Copy)详解 iOS
- php7 fastcgi安装,安装windows 下 php7+nginx+fastcgi
- windows环境下Nginx配置
- iOS 代码命名规范 及Android 代码命名规范(2)Android
- Hexo+Github搭建个人博客(一)——开始搭建
- ofd文件电子签章实现方法
- 对标TJA1043 SIT1043 带唤醒及故障保护的低功耗CAN FD总线收发器
- macbookair有没有touchbar_高配MacBook Air和低配MacBook Pro选哪个?
- 论文阅读|用于不同问题的MADDPG算法框架系列论文汇总
- 禅道CMS 11.6漏洞
- Linux攻关之基础模块十 特殊权限
- 在Ubuntu KyLin 16.04上安装g2o
- Head First Java 读书笔记(完整)
- MySQL | 普通索引和唯一索引,应该怎么选择?
- android5.1 MT6735 编译过程
- webAPP学习设计:页面模式的设计。
- matlab傅里叶工具箱,Matlab傅里叶算法及数字滤波
- 2022鹏城杯CTF---Crypto
热门文章
- 【bzoj3771】Triple FFT+容斥原理
- (转) 服务接口统一返回的格式
- 【LeetCode】154. Find Minimum in Rotated Sorted Array II (3 solutions)
- 2001年的FLTK设置教程
- python---方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法>
- 【前端】layui日期控件点击一闪而过解决方法
- 在vue项目中:统一封装 Axios 接口与异常处理
- Kettle连接HiveServer2配置和常见问题解决
- iOS 10、Xcode 8 遇到部分问题解决记录(包括控制台日志不输出)
- Invalid byte tag in constant pool: 19 与 javax/el/ELManager问题解决