leetcode712. 两个字符串的最小ASCII删除和(最短非公共子序列)

2023-11-05

传送门

题目:给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和。
输入: s1 = “sea”, s2 = “eat”
输出: 231
解释: 在 “sea” 中删除 “s” 并将 “s” 的值(115)加入总和。
在 “eat” 中删除 “t” 并将 116 加入总和。
结束时,两个字符串相等,115 + 116 = 231 就是符合条件的最小和

和1143题求的是互补的序列

动态过程中有三种状态(这里没有在字符串前加冗余字符,所以dp[i]比较的是字符s[i-1])

1.s1[i-1] == s2[j-1],新增的两个字符相等的情况下没有必要删除之前的结果,因此dp[i][j] = dp[i-1][j-1]

2.s1[i-1] != s2[j-1],取三者的最小值
(1)保留s2串,删除s1串的字符,dp[i][j] = dp[i-1][j] + s1.charAt(i-1)
(2)保留s1串,删除s2串的字符,dp[i][j] = dp[i][j-1] + s1.charAt(j-1)
(3)删除s1、s2串的字符,dp[i][j] = dp[i-1][j-1] + s1.charAt(i-1) + s2.charAt(j-1)

但是第三中情况会被包含在1或者2里,可以不写到dp里

1.加冗余字符的写法(dp[i][j]就对应的s1[i] s2[j])

 	public int minimumDeleteSum(String s1, String s2) {
        s1 = 'a' + s1; // 两个字符串前面加上冗余字符,dp[i][j]就比较的是字符s1[i],s2[j]
        s2 = 'a' + s2;
        int[][] dp = new int[s1.length()][s2.length()];
         
         // 注意:要初始化dp[0][j]和dp[i][0],这个初始化就算没有加冗余也要做的
         // 因为下面方程用到了dp[0][j] 和dp[i][0]
        for (int i = 1; i < s1.length(); ++i) {  
            dp[i][0] = dp[i - 1][0] + s1.charAt(i);// 不是累加
        }
        for (int j = 1; j < s2.length(); ++j) {
           dp[0][j] = dp[0][j - 1] + s2.charAt(j); // 不是累加
        }
        
        for (int i = 1; i < s1.length(); ++i) {
            for (int j = 1; j < s2.length(); ++j) {
                if (s1.charAt(i) == s2.charAt(j))
                    dp[i][j] = dp[i - 1][j - 1];
                else
                    dp[i][j] = min(dp[i - 1][j] + s1.charAt(i),//删除i
                        dp[i][j - 1] + s2.charAt(j),// 删除j
                        dp[i - 1][j - 1] + s1.charAt(i) + s2.charAt(j));//删除i和j, 可以省略
            }
        }
        return dp[s1.length() - 1][s2.length() - 1];
    }
    // 取a b c 最小值
    int min(int a, int b, int c) {
        int tmp = a < b ? a : b;
        return tmp < c ? tmp : c;
	}

2. 不加冗余字符,dp[i][j]代表的是字符串i-1,j-1的位置 1143里类似的方法

class Solution {
    public int minimumDeleteSum(String s1, String s2) {
        int len1 = s1.length(), len2 = s2.length();
        int[][] dp = new int[len1 + 1][len2 + 1];
        
        for (int i = 1; i <= len1; ++i) {
            dp[i][0] = dp[i - 1][0] + s1.charAt(i - 1);
        }
        
        for (int j = 1; j <= len2; ++j) {
            dp[0][j] = dp[0][j - 1] + s2.charAt(j - 1);
        }
        
        for (int i = 1; i <= len1; ++i) {
            for (int j = 1; j <= len2; ++j) {
                if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1];
                } else {
                    dp[i][j] = Math.min(dp[i - 1][j] + s1.charAt(i - 1), 
						dp[i][j - 1] + s2.charAt(j - 1));
                }
            }
            
        }
        return dp[len1][len2];
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode712. 两个字符串的最小ASCII删除和(最短非公共子序列) 的相关文章

  • 未能加载项目文件。缺少根元素。

    问题 项目无法加载或者无法打开 方法 删除项目的 Debug 和 Release 目录 或者删除 user 配置软件
  • 使用和生成库

    使用和生成库 基本概念 库有动态与静态两种 动态通常用 so为后缀 静态用 a为后缀 例如 libhello so libhello a 为了在同一系统中使用不同版本的库 可以在库文件名后加上版本号为后缀 例如 libhello so 1
  • 【Leetcode】145. 二叉树的后序遍历

    题目描述 给定一个二叉树 返回它的 后序 遍历 题解 递归法 执行用时 0 ms 在所有 Java 提交中击败了100 00 的用户 内存消耗 36 8 MB 在所有 Java 提交中击败了29 78 的用户 Definition for

随机推荐

  • 【深度学习】迁移学习

    什么是迁移学习 迁移学习 Transfer Learning 是一种机器学习方法 就是把为任务 A 开发的模型作为初始点 重新使用在为任务 B 开发模型的过程中 迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务 虽然大多数机器学
  • 服务器当然选算力强大、换“芯”成本低的

    有一句净水器的广告语人们耳熟能详 选净水器 当然选净化效果好 换芯成本低的 随着各行各业对算力需求的不断高涨 服务器的更新换代速度也越来越快 而除了常规的换 芯 以外 服务器系统在整体设计上如何更好地满足算力多样化 管理智能化 运营安全性和
  • 分享一个数据产品的PRD

    作者 LineLian 微信 firstbodytm 随着年龄的增长会越来越重视道 重视产品成功的系统原因 重视产品的团体环境 重视还原用户的真实因子 对于术比如用啥工具 写那些文档怎么写 交互方式是多么的酷炫 界面设计的是多么的棒 流程设
  • upstream模块(开发)

    http tengine taobao org book chapter 5 html upstream模块 100 nginx模块一般被分成三大类 handler filter和upstream 前面的章节中 读者已经了解了handler
  • 使用gdb调试多进程及多线程程序

    多进程调试 首先来了解下会可能会用到的调试命令 1 默认设置下 在调试多进程程序时GDB只会调试主进程 但是如果设置follow fork mode的话 就可调试多个进程 set follow fork mode parent child
  • 直角坐标系中点的旋转【点绕点旋转】

    前言 本文整理在平面直角系中 坐标系旋转 某点绕着坐标系旋转 坐标点A 绕着点B旋转 求旋转后的点坐标 看了网上好的文章 发现部分有误或不完整 这里简单总结一下 一 点绕坐标系旋转 坐标系不变 某点 绕坐标系 原点 旋转 角度 求旋转后点的
  • GET和POST的区别,java模拟postman发post请求

    目录 一 先说一下get和post 1 看一下人畜无害的w3schools怎么说 2 问一下文心你言哥 轻轻松松给你一个标准答案 3 卧槽 懂了 好像又没懂 二 让我们扒下GET和POST的外衣 坦诚相见吧 三 我们的大BOSS还等着出场呢
  • STM32Lx在低功耗下使用软件看门狗

    看门狗对于防止程序跑死是很关键的 很多时候我们的产品需要进入低功耗 而且唤醒间隔也比较长 此时如果看门狗启动了 那么就会导致处在低功耗的MCU发生复位 解决这个问题的方法有两种 一种是增加看门狗的喂狗时间间隔 保证此间隔大于MCU唤醒间隔
  • Person Search论文——《Query-guided End-to-End Person Search》CVPR 2019笔记

    1 论文主要思想 这篇论文是以 Joint Detection and Identification Feature Learning for Person Search 作为baseline进行改进的 在保持baseline中joint
  • 关于软件开发外包,你应该注意的细节

    伴随着社会的发展 许多公司都急需一款归属于自身的软件 或是别的对自身有价值的软件 当企业沒有自身的软件开发团队 或有团队但团队无法实现这一项目时 大家的另一个解决方案便是把这个软件开发项目外包给专业的软件开发公司 并给与合理的资金和酬劳 让
  • python socket监听端口_python 用socket模块实现检测端口和检测web服务

    以下程序均来自 Python UNIX和Linux系统管理指南 检测端口 check tcp port py usr bin env python import socket import re import sys def check s
  • Java——eclipse常用的调试debug的方法

    1 输出查看debug信息 1 System err println 以红色字体输出 例如以下一段代码 int ints new int 20 for int i 0 i lt 21 i ints i i 1 System out prin
  • CPU虚拟化技术

    基本概念 物理CPU数量 实际服务器插槽上的CPU个数 核 一块CPU上面能处理数据的芯片组的数量 超线程 在一个实体芯片组中提供两个逻辑线程 逻辑CPU数量 物理CPU数量 核 超线程 若支持超线程 该值为2 vCPU 虚机分配的CPU
  • KOA框架编程25 文件下载

    目录 1 前言 2 文件下载 1 前言 koa这个框架确实好玩 跟express相比有比较大的不一样 express更像是一个大杂烩 所有的功能都冗杂在一块 而koa更像是一个灵活性很高个体 所有的功能都以独立组件的形式存在 2 文件下载
  • vite + vue报错:TypeError: The argument ‘id‘ must be a non-empty string. Received ‘‘

    vite vue项目开发环境运行正常 打包后报错 知道是图片的原因导致报错 却不知道具体原因是啥 用了电脑系统路径的图片 如 home xxx aa png file home xxx aa png base64等等 网上找这种情况 一般都
  • java多线程同步以及线程间通信

    文章目录 1 线程同步问题的产生 2 解决线程同步的两种典型方案 2 1 通过锁 Lock 对象的方式解决线程安全问题 2 2 synchronied关键字 2 2 1 同步方法 2 2 2 同步块 2 2 3 通过synchronied关
  • 若依框架富文本框的实现

    若依框架富文本框的实现 前端部分 引入summernote的js跟css
  • RestTemple调用接口,上传文件form-data方式

    前端调用后台服务上传文件 后端使用restTemple调用接口把文件传到其他服务上去 RequestMapping test public void upload MultipartFile file String originalFile
  • gcc编译时 warning:incompatible implicit declaration of built-in function ‘xxx’

    报错是因为我们没有添加该函数所在头文件 可通过man xxx来查询xxx函数所在的头文件 添加后即可
  • leetcode712. 两个字符串的最小ASCII删除和(最短非公共子序列)

    传送门 题目 给定两个字符串s1 s2 找到使两个字符串相等所需删除字符的ASCII值的最小和 输入 s1 sea s2 eat 输出 231 解释 在 sea 中删除 s 并将 s 的值 115 加入总和 在 eat 中删除 t 并将 1