最短编辑距离(线性dp)-java

news2024/11/23 12:08:03

最短编辑问题也是一种非常经典的二维线性dp问题。

 

文章目录

前言

一、最短编辑距离问题

二、算法思路

1.dp[i][j]的情况

 2.边界问题初始化

3.状态转移方程

三、代码如下

1.代码如下

2.读入数据

3.代码运行结果

总结


前言

最短编辑问题也是一种非常经典的二维线性dp问题。


提示:以下是本篇文章正文内容,下面案例可供参考

一、最短编辑距离问题

给定两个字符串A和B,现将字符串A转换成字符串B至少进行多少次操作?

可进行的操作如下:

  1. 删除–将字符串 A 中的某个字符删除。
  2. 插入–在字符串 A 的某个位置插入某个字符。
  3. 替换–将字符串 A 中的某个字符替换为另一个字符。

字符串中均只包含大小写字母 。

二、算法思路

1.dp[i][j]的情况

我们引入字符数组a来存储字符串A,字符数组b来存储字符串B。

引入二维dp数组,dp[i][j]表示字符串A的前i个字符变成字符串B的前j个字符所需要的最小操作数。

423f1b659c0347feb66c69cec633f4df.png图1.1思路模拟

 由题意可知,我们如果想把字符串A变成字符串B,讨论字符串A的前i个和字符串B的前j个,即讨论dp[i][j]的值: 

  • 增加一个字符:此时说明字符串A的前i个字符跟字符串B的前j-1个字符相等

eq?dp%5Bi%5D%5Bj%5D%20%3D%20dp%5Bi%5D%5Bj-1%5D%20+%201 

  • 删除一个字符:此时说明字符串A的前i-1个字符跟字符串B的前j个字符相等

 eq?dp%5Bi%5D%5Bj%5D%20%3D%20dp%5Bi-1%5D%5Bj%5D%20+%201

  •  替换一个字符:此时说明字符串A的前i-1个字符跟字符串B的前j-1相等

eq?dp%5Bi%5D%5Bj%5D%20%3D%20dp%5Bi-1%5D%5Bj-1%5D%20+%201 

  • 无操作,此时说明字符串A的第i个字符和字符串B的第j个字符是相等的,那么直接取dp[i-1][j-1]的值即可 

eq?dp%5Bi%5D%5Bj%5D%20%3D%20dp%5Bi-1%5D%5Bj-1%5D 

最后我们需要直到最少操作数,那么我们就需要在上述情况中找到最小值。

 2.边界问题初始化

我们需要考虑当dp[i][j]中i为0的情况或者j为0的情况:

  • 当i为0的情况,此时说明字符串A为空,那么字符串A想要变成字符串B就只能通过增加操作。

eq?dp%5B0%5D%5Bj%5D%20%3D%20j 

eq?m%5Cgeqslant%20j%5Cgeqslant%200 

  • 当j为0的情况,此时说明字符串B为 空,那么字符串A想要变成字符串B只能进行删除操作

eq?dp%5Bi%5D%5B0%5D%20%3D%20i 

eq?n%5Cgeqslant%20i%5Cgeqslant%200 

3.状态转移方程

删除和添加操作:

eq?dp%5Bi%5D%5Bj%5D%20%3D%20min%28dp%5Bi-1%5D%5Bj%5D%2Cdp%5Bi%5D%5Bj-1%5D%29+1 

当a[i] != b[j]时,替换操作:

eq?dp%5Bi%5D%5Bj%5D%20%3D%20min%28dp%5Bi%5D%5Bj%5D%2Cdp%5Bi-1%5D%5Bj-1%5D+1%29 

当a[i] = b[j],不进行操作:

eq?dp%5Bi%5D%5Bj%5D%20%3D%20min%28dp%5Bi%5D%5Bj%5D%2Cdp%5Bi-1%5D%5Bj-1%5D%29 

三、代码如下

1.代码如下


import java.io.*;
import java.util.Scanner;

public class 最短编辑距离 {
    static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
    public static void main(String[] args) {
        Scanner sc = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
        int n = sc.nextInt();
        String a = sc.next();
        int m = sc.nextInt();
        String b = sc.next();
        char[] Achar = new char[1010];
        char[] Bchar = new char[1010];
        for (int i = 1; i <= n; i++) {
            Achar[i] = a.charAt(i-1);
        }
        for (int i = 1; i <= m ; i++) {
            Bchar[i] = b.charAt(i-1);
        }
        int[][] dp = new int[1010][1010];
        //表示字符串B为空,那么字符串A的前i个字符变成字符串只进行删除操作
        //有多少个字符就进行多少次删除操作
        for(int i = 1; i <= n;i++){
            dp[i][0] = i;
        }
        //表示字符串A为空,字符串B的长度为i
        //那么把字符串A变成字符产B只能进行添加操作
        for(int i = 1;i <= m;i++){
            dp[0][i] = i;
        }
        for(int i = 1;i <= n;i++){
            for(int j = 1;j <= m;j++){
                dp[i][j] = Math.min(dp[i][j-1],dp[i-1][j])+1;
                if(Achar[i] != Bchar[j]){
                    dp[i][j] = Math.min(dp[i][j],dp[i-1][j-1]+1);
                }else {
                    dp[i][j] = Math.min(dp[i][j],dp[i-1][j-1]);
                }
            }
        }
        pw.println(dp[n][m]);
        pw.flush();
    }
}

2.读入数据

10 
AGTCTGACGC
11 
AGTAAGTAGGC

3.代码运行结果

4

 


总结

最短编辑问题我们需要知道dp[i][j]中i和j分别表示的含义,以及知道状态转移方程是如何推导出来的即可。

 

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

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

相关文章

NzN的数据结构--插入排序

排序排序我要Disney&#xff0c;今天我们先来看看经典排序算法里的插入排序&#xff0c;先三连后看才是好习惯&#xff01;&#xff01;&#xff01; 目录 一、排序的概念及应用 1. 排序的概念 2. 排序的应用 3. 常见的排序算法 二、插入排序 1. 基本思想 2. 直接插入排…

算法打卡day40|动态规划篇08| Leetcode 139.单词拆分|多重背包理论|背包问题总结篇

目录 算法题 Leetcode 139.单词拆分 个人思路 解法 动态规划 回溯法 多重背包理论基础 背包问题总结篇 解题思路 背包递推公式 遍历顺序 01背包 完全背包 算法题 Leetcode 139.单词拆分 题目链接:139.单词拆分 大佬视频讲解&#xff1a;单词拆分视频讲解 个人思…

使用pytorch构建控制生成GAN(Controllable GAN)网络模型

本文为此系列的第四篇Controllable GAN&#xff0c;上一篇为Conditional GAN。文中使用训练好的模型和优化噪声向量来操纵生成图像的特定属性&#xff0c;若有不懂的无监督知识点可以看本系列第一篇。 原理 本文主要讲什么是控制生成&#xff0c;以及如何做到控制生成。 什么是…

华为S5735S核心交换配置实例

以下脚本实现创建vlan2,3&#xff0c;IP划分&#xff0c;DHCP启用&#xff0c;接口划分&#xff0c;ssh,telnet,http,远程登录启用 默认用户创建admin/admin123提示首次登录需要更改用户密码 sysname test-Hxvlan 2 description to test1…

JavaScript(1)神秘的编程技巧

大家都感兴趣的箭头函数 箭头函数在许多场景中都可以发挥作用&#xff0c;尤其适用于简化函数声明和提高代码的可读性。以下是箭头函数可以使用的一些常见方面&#xff1a; &#xff08;1&#xff09;回调函数&#xff1a; 箭头函数特别适合作为回调函数&#xff0c;例如在事…

html基础(2)(链接、图像、表格、列表、id、块)

1、链接 <a href"https://www.example.com" target"_blank" title"Example Link">Click here</a> 在上示例中&#xff0c;定义了一个链接&#xff0c;在网页中显示为Click here&#xff0c;鼠标悬停指示为Example Link&#xff0c…

电脑开机提示“no bootable device”,无法进入系统

当您的Windows 10电脑开机时提示“no bootable device”,这意味着计算机无法找到一个可以启动操作系统的设备。这个问题通常与硬件连接、BIOS设置、硬盘问题、引导扇区故障或系统文件损坏等有关。以下是一系列详细的解决步骤: 检查硬件连接:关闭电脑,拔掉电源线,打开机箱检…

Android OOM问题定位、内存优化

一、常用工具&#xff1a; 1、LeakCanary val refWatcher: RefWatcher? TestApp.getRefWatcher(activity) refWatcher?.watch(activity);//检测是否有泄露&#xff0c;即触发GC回收&#xff0c;看activity是否被回收&#xff0c;没有被回收就是泄露了。 二、常见的几种内…

PanTools v1.0.20 多网盘批量管理工具 批量管理、分享、转存、重命名、复制...

一款针对多个热门网盘的文件管理、批量分享、批量转存、批量复制、批量重命名、批量链接检测、跨账号移动文件、多账号文件搜索等&#xff0c;支持不同网盘的不同账号的资源文件操作。适用于网站站长、资源爱好者等&#xff0c;对于管理名下具有多个网盘多个账号具有实用的效果…

计算系数(acwing,数论)

题目描述&#xff1a; 给定一个多项式 (axby)^k&#xff0c;请求出多项式展开后 x^n*y^m 项的系数。 输入格式&#xff1a; 共一行&#xff0c;包含 5 个整数&#xff0c;分别为 a&#xff0c;b&#xff0c;k&#xff0c;n&#xff0c;m&#xff0c;每两个整数之间用一个空格…

STC89C52学习笔记(七)

STC89C52学习笔记&#xff08;七&#xff09; 综述&#xff1a;本文介绍了串口以及讲述了串口相关寄存器如何配置并给予相关代码。 一、修改代码注意事项 在修改代码时不要一次性加入一堆代码&#xff0c;不利于定位错误。可以先注释一些代码&#xff0c;待解决完毕问题后再…

基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba并采用前后端分离的企业级微服务多租户系统架构

简介 基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba并采用前后端分离的企业级微服务多租户系统架构。并引入组件化的思想实现高内聚低耦合并且高度可配置化&#xff0c;适合学习和企业中使用。 真正实现了基于RBAC、jwt和oauth2的无状态统一权限认证的解决方案&#x…

基于ubuntu22.04系统安装nvidia A100驱动与NVLink启用

1、官方仓库 针对驱动包下载认准nvidia官网 dpkg -i nvidia-driver-local-repo-ubuntu2204-550.54.15_1.0-1_amd64.deb apt update apt search nvidia-driver-5502、安装 根据步骤1apt search nvidia-driver-550查出版本&#xff1a;此驱动包封在nvidia-driver-local-repo-ub…

关于vue使用第三方faceBook登录

在这里引入这位博主的 https://blog.csdn.net/qq_40942490/article/details/118333318https://blog.csdn.net/qq_40942490/article/details/118333318在他的基础上我增加了退出登录操作,一定要清除所有的cookie不然就会导致退出登录后无法再次使用faceBook登录 FB.getLoginSt…

【leetcode面试经典150题】28.盛最多水的容器(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

2024Peak码支付系统网站源码

系统简介 Peak码支付-是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。用全新轻量化的界面UI&#xff0c;让您可以更加方便快捷地解决知识付费和运营赞助的难题。同时&#xff0c;它基于高性能SpeedPHPLayuiPearAdmin架构&#xff0c;提供实时监控和…

【Springboot开发】后端代码基础框架

前言&#xff1a;主要介绍最基础的springboot开发架构 目录 1. overall2. 配置文件2.1 YAML2.2 properties2.3 配置文件加载顺序2.4 多配置文件 3. 代码包3.1 infrastructure3.1.1 persistence 3.2 application3.2.1 dto3.2.2 converter3.2.3 service 3.3 api3.3.1 vo3.3.2 req…

深入解析:企业如何通过大型语言模型(LLMs)优化产品与工作流程

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

基于令牌桶算法对高并发接口的优化

业务背景 项目中有一个抽奖接口&#xff0c;此接口需要处理高并发问题以及使用脚本作弊的问题。 本文主要探讨如何最大程度地减少脚本作弊行为对抽奖业务的影响。 设计思路 如何减少脚本作弊行为对抽奖业务的影响 使用令牌桶算法&#xff0c;对频率过高的用户请求进行拦截 …

关于ansible的模块 ⑤

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 继《关于Ansible的模块 ①》、《关于Ansible的模块 ②》、《关于Ansible的模块 ③》与《关于Ansible的模块 ④》之后&#xff0c…