动态规划——编辑距离问题

假设有a,b两个字符串,现对a字符串进行修改使得a字符串与b字符串完全一样;要求是使用最小的操作次数,使a,b字符串相等。操作有三种,分别是插入一个字符,删除一个字符,替换一个字符。

假设:
a字符串内容为horse
b字符串内容为rose

解题思路
枚举a字符串的所有子串转换到b字符串的所有子串的编辑情况

a:[ h o r s e ]↑i
b:[ r o s e ]↑j

目测将horse 编程rose需要2次操作
将h替换成r,将第二个r删掉。

该题的重复子过程如下:
a:horse – > b:rose

转换操作次数步骤
a:h -> b:r1次操作将h替换成r
a:h -> b:ro2次操作将h替换成r,插入o
a:h -> b:ros3次操作将h替换成r,插入o,插入s
a:h -> b:rose4次操作将h替换成r,插入o,插入s,插入e
转换操作次数步骤
a:ho -> b:r2次操作将h替换成r,将o删除
a:ho -> b:ro1次操作将h替换成r
a:ho -> b:ros2次操作将h替换成r,插入s
a:ho -> b:rose3次操作将h替换成r,插入s,插入e
转换操作次数步骤
a:hor -> b:r2次操作删除h,删除o
a:hor -> b:ro2次操作将h替换成r,将第二个r删除
a:hor -> b:ros2次操作将h替换成r,将第二个r替换成s
a:hor -> b:rose3次操作将h替换成r,将第二个r替换成s,插入e
转换操作次数步骤
a:hors -> b:r3次操作删除h,删除o,删除s
a:hors -> b:ro3次操作将h替换成r,将第二个r删除,删除s
a:hors -> b:ros2次操作将h替换成r,将第二个r删除
a:hors -> b:rose3次操作将h替换成r,将第二个r删除,插入e
转换操作次数步骤
a:horse -> b:r4次操作删除h,删除o,删除s,删除e
a:horse -> b:ro4次操作将h替换成r,将第二个r删除,删除s,删除e
a:horse -> b:ros3次操作将h替换成r,将第二个r删除,删除e
a:horse -> b:rose2次操作将h替换成r,将第二个r删除

从a字符串视角,每一组操作,都可以在前一个字符的基础上去删除,插入,替换。
即:
对horse的决策可以从对hors的决策推断出
对hors的决策可以从对hor的决策推断出
对hor的决策可以从ho的决策推断出
对ho的决策可以从对h的决策推断出
对h的决策可以从对空集的决策推断出

这明显的包含了重复的子过程,有重复的子过程,动态规划走起

将表格转换成另一种形式

‘’rose
‘’01234
h11234
o22123
r32223
s43323
e54432

可见horse -> rose的转换操作,最少次数为2
e->e(无需转换)
s->s(无需转换)
hor->ro(需要转换2次,是从ho->o状态流转过来的)
ho->o(需要转换1次)
h->r(需要转换1次)
所以总共需要转换2次

h
r
ho
ro
hor
horse
rose

换一种理解方式
有两个字符串:a,b
若这两个字符串最后一个字符已经相同,则将a转换到b,只需要考虑a去掉最后一个字符,和b去掉最后一个字符这两个字符串。

a:[   |x]
b:[      |x]
如果 a[i-1] 与 b[j-1] 的值相等 只需要考虑编辑a[i-1],b[j-1]之前的字符即可 

若a,b字符串最后一个字符不同

a:[   |x]
b:[      |y]

则有三种情况

  1. a删除最后一个字符后的字符串与b高度重合
  2. a向末尾插入一个字符后的字符串与b高度重合
  3. a替换最后一个字符后的字符串与b高度重合
如果 a[i-1] 与 b[j-1] 的值相等 只需要考虑编辑a[i-1],b[j-1]之前的字符即可 
否则 (潜台词 a[i-1] 与 b[j-1] 的值不相等 )考虑删除a的一个字符考虑向a的末尾插入一个字符考虑替换a末尾的字符    

假设我们有一张二维表,已经缓存过horse 到 rose 转换的部分步骤信息,即可根据以往的信息,推测出下一步的转换计划,此题考查最少的转换步骤,代码如下:

package mainimport ("fmt"
)func main() {a := "horse"b := "rose"//fmt.Scan(&a)//fmt.Scan(&b)dp := make([][]int, len(a)+1)for i := 0; i < len(a)+1; i++ {dp[i] = make([]int, len(b)+1)}for i := 0; i < len(a)+1; i++ {dp[i][0] = i}for j := 0; j < len(b)+1; j++ {dp[0][j] = j}for i := 1; i <= len(a); i++ {for j := 1; j <= len(b); j++ {if a[i-1] == b[j-1] {dp[i][j] = dp[i-1][j-1]} else {dp[i][j] = min3(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1}}}fmt.Println(dp[len(a)][len(b)])
}func min3(a, b, c int) int {return min(min(a, b), c)
}func min(a, b int) int {if a < b {return a}return b
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/653018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机提示缺失dll文件怎么办?那种dll解决方法更值得推荐

当在运行游戏&#xff0c;软件程序的过程中遇到“找不到dll”的情况时&#xff0c;这实际上意味着系统或应用程序无法定位并加载必要的动态链接库文件&#xff08;DLL&#xff09;&#xff0c;从而无法顺利完成预期的功能调用和执行流程。这种问题的发生可能会引发一系列严重后…

Selenium + Django + Echarts 实现亚马逊商品数据可视化爬虫项目

最近完成了1个爬虫项目&#xff0c;记录一下自己的心得。 项目功能简介 根据用户输入商品名称、类别名称&#xff0c;使用Selenium, BS4等技术每天定时抓取亚马逊商品数据&#xff0c;使用Pandas进行数据清洗后保存在MySql数据库中. 使用Django提供用户端功能&#xff0c;显…

PostgreSQL15安装和实现物理复制(主从配置)全程指南

1 概述 本文介绍如何在centos7或rocky9下安装postgresql15&#xff0c;并配置物理复制的全过程。postgresql安装采用shell脚本安装&#xff0c;一键执行&#xff0c;通俗易懂。 2 环境说明 序号IP操作系统用途备注0110.10.0.41rockylinux9.3主库0210.10.0.42rockylinux9.3从…

【electron】安装网络问题处理

目录 场景排查问题排查结论electron 安装失败解决方案 新的问题electron-builder 打包失败处理 场景 在mac上使用electron进行代码开发的时候&#xff0c;无法正常下载与electron、electron-builder相关的依赖 排查问题 是不是因为没有翻墙导致资源无法下载是不是没有设置正…

软件门槛之算法

软件门槛之算法 1.背景2.算法定义3.特征4.基本要素5.常用设计模式6.常用实现方法7.复杂度时间复杂度空间复杂度8.分类9.算法常用的一些工具10.算法的检验标准1.背景 一入行业深似海 再回首已是白发生! 工作这么多年了,感觉算法是比较难搞的。 写代码最重要的可能是框架和算法…

【Linux环境配置】core dump配置和快速gdb调试core文件

文章目录 0. 在Ubuntu系统中直接运行导致coredump的程序并没有生成core文件1. core dump 设置1.1 设置core文件格式1.2 设置core 大小限制 2. 写个代码测一下2.1 示例代码放入 test.c 中2.2 编译运行2.3 gdb调试一下core 3. 参考资料 0. 在Ubuntu系统中直接运行导致coredump的程…

MC3172 串口模块

MC3172 支持12个串口对应关系如下 串口模块初始化 第一个是uart0~11 inpin RX 脚 管脚号 outpin TX脚 管脚号 baud 波特率 read_ptr ,数据读取指针 void uart_init(u32 uart_num,u8 in_pin,u8 out_pin,u32 baud,u8* read_ptr) {INTDEV_SET_CLK_RST(uart_num,(INTDEV_RUN|…

React中antd的使用技巧

1.antd的基本使用&#xff1a; (1).yarn add antd(2).引入样式&#xff1a;import antd/dist/antd.css;(3).根据文档引入组件2.antd按需引入样式 (1).yarn add react-app-rewired customize-cra babel-plugin-import(2).修改package.json&#xff0c;内容如下&#xff1a;.....…

HCIP-三层架构实验

实验拓扑 实验需求 实验思路 配置IP地址 链路聚合 vlan配置 配置生产树 实验步骤 配置IP地址 以R1为例 <Huawei>sys [Huawei]sys r1 [r1]int g0/0/02 [r1-GigabitEthernet0/0/2]ip address 12.1.1.1 24 Jan 28 2024 17:09:03-08:00 r1 %%01IFNET/4/LINK_STATE(l…

一天吃透面试八股文

内容摘自我的学习网站&#xff1a;topjavaer.cn 分享50道Java并发高频面试题。 线程池 线程池&#xff1a;一个管理线程的池子。 为什么平时都是使用线程池创建线程&#xff0c;直接new一个线程不好吗&#xff1f; 嗯&#xff0c;手动创建线程有两个缺点 不受控风险频繁创…

vue中使用jweixin-module

目录 一&#xff1a;安装jweixin-module 二&#xff1a;后端配置 三&#xff1a;获取签名并注入配置 四&#xff1a;调用微信JS接口 在Vue项目中使用jweixin-module&#xff08;或通常称为jweixin&#xff0c;即微信JS-SDK的封装&#xff09;来调用微信提供的JS接口&#x…

二叉树

目录 1翻转二叉树 2对称二叉树 3二叉树的深度 最大深度 最小深度 4二叉树的结点数量 完全二叉树的结点数量 5平衡二叉树 6 中序 后序求前序 二叉树结构体如下&#xff1a; struct freenode {int data;struct freenode *lchild, *rchild;//左孩子 右孩子 }T; 1翻转二…

每日OJ题_算法_前缀和②_牛客DP35 【模板】二维前缀和

目录 二维前缀和原理 ②牛客DP35 【模板】二维前缀和 解析代码 二维前缀和原理 在一维数组前缀和算法的基础上&#xff0c;想到&#xff1a;计算二维数组前缀和&#xff0c;不就和计算一维数组前缀和一样&#xff0c;即计算每一个位置的前缀和就相当于&#xff1a; 此位置的…

qt学习:json数据文件读取写入

目录 什么是json 基本格式 例子 解析json文件数据到界面上 组合json数据文档对象 什么是json json是一种轻量级的数据交互格式&#xff0c;简单来说&#xff0c;json就是一种在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言中的数据传递和交互 基本格式 以…

Top100 子串

1.560. 和为 K 的子数组 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2示例 2&#xff1a; 输入&#…

VUE引入DataV报错记录

DataV官网&#xff08;不支持Vue3&#xff09;&#xff1a;Welcome | DataV 一、按照官网引入后报错 【1】 Failed to resolve entry for package "dataview/datav-vue3". The package may have incorrect main/module/exports specified in its package.json. 将…

服务器托管与虚拟主机租用有哪些区别?

服务器托管又称为主机托管&#xff0c;是用户自身拥有一台服务器放置在数据中心的机房里&#xff0c;主要是由客户自己进行维护&#xff0c;用户自身就可以进行操作系统&#xff0c;企业将服务器放置在专用的托管服务器机房中&#xff0c;可以享受到稳定舒适的机房环境&#xf…

ARC143D Bridges

题目 把 i i i 和 i n in in 看作一个点&#xff0c;对所有 a i a_i ai​ 和 b i b_i bi​ 连边&#xff0c;得到的图称为 G G G&#xff0c;则 G G G 的割边 ( a i , b i ) (a_i,b_i) (ai​,bi​) 在原图中 ( a i , b i n ) (a_i,b_in) (ai​,bi​n) 或 ( a i n ,…

【Matlab】音频信号分析及FIR滤波处理——凯泽(Kaiser)窗

一、前言 1.1 课题内容: 利用麦克风采集语音信号(人的声音、或乐器声乐),人为加上环境噪声(窄带)分析上述声音信号的频谱,比较两种情况下的差异根据信号的频谱分布,选取合适的滤波器指标(频率指标、衰减指标),设计对应的 FIR 滤波器实现数字滤波,将滤波前、后的声音…

贪吃蛇/链表实现(C/C++)

本篇使用C语言实现贪吃蛇小游戏&#xff0c;我们将其分为了三个大部分&#xff0c;第一个部分游戏开始GameStart&#xff0c;游戏运行GameRun&#xff0c;以及游戏结束GameRun。对于整体游戏主要思想是基于链表实现&#xff0c;但若仅仅只有C语言的知识还不够&#xff0c;我们还…