动态规划--(不同的子序列,编辑距离,两个字符串的删除)

news2025/7/18 8:44:42

代码随想录day56 动态规划模块 不同的子序列,编辑距离,两个字符串的删除

文章目录

    • 1.leetcode 115. 不同的子序列
        • 1.1思路及详细步骤
        • 1.2 代码示例
    • 2.leetcode 583. 两个字符串的删除操作
        • 2.1思路及详细步骤
        • 2.2 代码示例
    • 3.leetcode 72. 编辑距离
        • 3.1思路及详细步骤
        • 3.2 代码示例

1.leetcode 115. 不同的子序列

在这里插入图片描述

1.1思路及详细步骤

  按照动态规划的做题步骤来分析

   1.确定dp数组以及下标的含义

dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。

   2. 确定递推公式

s[i - 1] 与 t[j - 1]相等
s[i - 1] 与 t[j - 1] 不相等
当s[i - 1] 与 t[j - 1]相等时,dp[i][j]可以有两部分组成。
一部分是用s[i - 1]来匹配,那么个数为dp[i - 1][j - 1]。
一部分是不用s[i - 1]来匹配,个数为dp[i - 1][j]

  3. dp数组的初始化问题

那么dp[i][0]一定都是1,

  4.确定遍历顺序

从前往后的遍历两层

  5.推导dp数组

1.2 代码示例

class Solution {
    public int numDistinct(String s, String t) {
     int[][] dp=new int[s.length()+1][t.length()+1];
     for(int i=0;i<=s.length();i++){
         dp[i][0]=1;
     }
    // for(int i=0;i<=t.length();i++){
    //      dp[0][i]=1;
    //  }
     for(int i=1;i<=s.length();i++){
         for(int j=1;j<=t.length();j++){
             if(s.charAt(i-1) == t.charAt(j-1)){
                 dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
             }else{
                 dp[i][j]=dp[i-1][j];
             }
         }
     }
     return dp[s.length()][t.length()];
    }
}

2.leetcode 583. 两个字符串的删除操作

在这里插入图片描述

2.1思路及详细步骤

  直接用最大子序和的方法做 点这里

2.2 代码示例

class Solution {
    public int minDistance(String word1, String word2) {
       int[][] dp=new int[word1.length()+1][word2.length()+1];

            for (int i = 1; i <= word1.length(); i++) {

              for (int j = 1; j <= word2.length(); j++) {
                if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
                    dp[i][j]=dp[i-1][j-1]+1;
                } else {
                    dp[i][j]=Math.max(dp[i][j-1],dp[i-1][j]);
                }
            }
        }
       return word1.length()+word2.length()-2*dp[word1.length()][word2.length()];
    }
}

3.leetcode 72. 编辑距离

在这里插入图片描述

3.1思路及详细步骤

  按照动态规划的做题步骤来分析

   1.确定dp数组以及下标的含义

dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]。

   2. 确定递推公式

if (word1[i - 1] == word2[j - 1])
不操作
if (word1[i - 1] != word2[j - 1])



if (word1[i - 1] == word2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1];
}
else {
dp[i][j] = min({dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]}) + 1;
}

  3. dp数组的初始化问题

for (int i = 0; i <= word1.size(); i++) dp[i][0] = i;
for (int j = 0; j <= word2.size(); j++) dp[0][j] = j;

  4.确定遍历顺序

从前往后的遍历两层

  5.推导dp数组

3.2 代码示例

class Solution {
    public int minDistance(String word1, String word2) {
       int[][] dp=new int[word1.length()+1][word2.length()+1];
    for (int i = 1; i <= word1.length(); i++) {
        dp[i][0] =  i;
    }
    for (int j = 1; j <= word2.length(); j++) {
        dp[0][j] = j;
    }
            for (int i = 1; i <= word1.length(); i++) {

              for (int j = 1; j <= word2.length(); j++) {
                if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
                    dp[i][j]=dp[i-1][j-1];
                } else {
                     dp[i][j] = Math.min(Math.min(dp[i - 1][j - 1], dp[i][j - 1]), dp[i - 1][j])+1;
                }
            }
        }
       return dp[word1.length()][word2.length()] ;
    }
}

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

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

相关文章

绝对最直白的MySQL MVCC机制总结,免费拿走

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;后端领域优质创作者&#xff0c;阿里云社区技术博主&#xff0c;热爱分享创作 &#x1f492; 公众号&#xff1a;知识浅谈 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 绝对最直…

项目实战 - tpshop商城项目环境搭建

一、环境部署准备 1、软件工具准备 1.1、Vmware虚拟机 1. 在本机上安装好Vmware虚拟机 2. 在虚拟机上安装并运行Linux系统 3. 注意: 实际工具中使用云服务器 1.2、远程连接工具 1. 在本机上安装好远程连接工具 (xshell / putty / FinalShell&#xff08;推荐&#xff09;) …

三种常见的特征选择方法

特征选择 特征选择是特征工程里的一个重要问题&#xff0c;其目标是寻找最优特征子集。特征选择能剔除不相关(irrelevant)或冗余(redundant )的特征&#xff0c;从而达到减少特征个数&#xff0c;提高模型精确度&#xff0c;减少运行时间的目的。并且常能听到“数据和特征决定…

k8s master 实现高可用

Kubernetes高可用master架构 k8s的高可用&#xff0c;主要是实现Master节点的高可用。那么我们看看各个组件是如何解决高可用的。 Kubelet、Kube-proxy&#xff1a;只工作在当前Node节点上&#xff0c;无需高可用。 etcd&#xff1a;etcd如果是放在集群内部的&#xff0c;在…

长文讲解Linux内核性能优化的思路和步骤

一.性能调优简介 1.为什么要进行性能调优&#xff1f; 1&#xff09; 编写的新应用上线前在性能上无法满足需求&#xff0c;这个时候需要对系统进行性能调优 2&#xff09; 应用系统在线上运行后随着系统数据量的不断增长、访问量的不断上升&#xff0c;系统的响应速度通常越…

js-学习链表

链表基础概念 链表和数组一样&#xff0c;可以用于存储一系列连续的元素。链表中的元素在内存中不必是连续的空间。链表的每一个元素有一个由一个存储元素本身的节点和一个指向下一个元素的引用组成(指针和连接)。 链表构成 数据指针 链表优点 1.内存空间不是必须连续的&a…

实践分享:30分钟在电脑端运行小程序

预计实现效果&#xff1a;在电脑桌面端实现小程序运行 技术实现&#xff1a;小程序容器技术实现&#xff08;案例使用FinClip SDK) 技术的原理&#xff1a; 该 SDK 主要包括应用交互层、安全防护、网络通信控制和安全运行容器四个组件。 应用交互层&#xff1a;应用交互层是…

DBSCAN算法实现【超详细注释】

DBSCAN 算法步骤 设置每个对象为未访问 随机选择一个未访问的点ppp,标记ppp表示访问 如果p的半径为nnn的邻域中至少存在MinPts个对象 我们就创建一个新的簇&#xff0c;并将ppp加入ccc设N 是ppp邻域中对象的集合对在NNN中的每个点p′pp′ 如果p′pp′是未访问的 标记p′pp′…

Matlab:数值积分与符号计算

Matlab数值积分定积分的数值求解实现自适应积分算法梯形积分法累计梯形积分多重定积分的数值求解实现符号计算符号对象及其运算符号微积分符号极限符号导数求不定积分符号方程求解数值积分 数值积分&#xff0c;用于求定积分的近似值。在数值分析中&#xff0c;数值积分是计算定…

SQL Server简介

SQL Server是微软的一款关系型数据库。某些平台吹得天花烂坠&#xff0c;今天第一次在自己的项目中使用了下&#xff0c;感觉不是那么好&#xff0c;特别是SQL语句的支持度还是很欠缺&#xff0c;如limit等都不支持&#xff0c;还有特别单双引号都是需要特别注意的,下面是SQL S…

从0到1CTFer成长之路——1git(全网最详细)

1.1.2.1 git 泄露 (1) 常规git泄露 安装docker sudo apt-get update sudo apt-get install docker 安装容器 docker pull ubuntu:18.04 然后发现请求超时 我们需要阿里云的镜像加速器 我们按照要求配置文件 没有/etc/docker 就自己创建 sudo mkdir -p /etc/docker 然后写入…

Cookie与Session 以及给CBV添加装饰器

文章目录Cookie与Session1、Django操作cookie简单实现用户登录加入装饰器2、Django操作session设置session获取session过期时间清除sessionCBV添加装饰器Cookie与Session HTTP被设计为”⽆态”&#xff0c;也就是俗称“脸盲”。 这⼀次请求和下⼀次请求 之间没有任何状态保持&…

跨模态神经搜索实践VCED 环境准备

跨模态神经搜索实践 环境准备 本文基于WSL2及docker进行环境搭建 1. 安装和配置WSL2 Ubuntu发行版 1.1 安装WSL2 Ubuntu 相关安装命令&#xff1a; wsl --install&#xff1a;默认安装Ubuntu发行版wsl --list --online&#xff1a;查看可支持的发行版本wsl --install -d &…

如何将 wordfile 添加到 UltraEdit 或 UEStudio

UltraEdit 本身支持开箱即用的最常用编程和标记语言的语法突出显示。我们也有数百个其他语言的 wordfile&#xff0c;但是&#xff0c;很容易找到和添加您需要的语言&#xff01; 重要提示&#xff1a;此电源提示适用于运行 UltraEdit v15.00或 UEStudio v09.10及更高版本的用户…

Ubuntu18.04系统安装nginx

Ubuntu18.04系统安装nginx一、在线安装 Nginx二、离线安装 Nginx参考链接请确保以具有 sudo 权限的用户身份登录&#xff0c;并且您没有在端口 80 或 443 上运行 Apache 或任何其他 Web 服务器。 一、在线安装 Nginx 简介&#xff1a;Nginx (engine x) 是一个免费的&#xff0…

swift-类属性

了解属性之前&#xff0c;需要先了解前面的swift-类结构内容 - swift-类结构源码探寻 FieldDescriptor TargetClassDescriptor {var Flags: ContextDescriptorFlags // uint32var Parent: TargetRelativeContextPointer // Int32var Name: TargetRelativeDirectPointer // I…

Markdown还能这么玩?这款开源神器绝了!

Markdown是一款轻量级标记语言&#xff0c;由于它易读易写的特性&#xff0c;很多程序员用它来写项目文档。其实Markdown的功能不止于此&#xff0c;结合一些工具使用还可以用来做PPT&#xff0c;今天带大家使用Markdown来做一个PPT&#xff0c;看看到底有多炫酷&#xff01; S…

《springboot那些事》

注&#xff1a;static目录、主要用于存放非模板引擎渲染的资源。 ​ template目录&#xff0c;存放渲染引擎页面的资源。 一句话&#xff1a;用模板引擎的话&#xff0c;就放template目录、否则static目录。 一、使用thymeleaf 引入thymealeaf坐标 <dependency><…

22.11.15打卡 mysql学习笔记

学了DDL和DQL, 今天课太多, 没怎么学啊, 很烦躁, 还有3周要考试了 空格可以有一个或者多个 if not exists表示不存在则执行, 存在则不执行 方括号当中的都可 create database itcase; show databases;查看数据库 再次创建itcase数据库 加上if not exists就不会报错 字符集演示 …

DPDK LPM库(学习笔记)

1 LPM库 DPDK LPM库组件为32位的key实现了最长前缀匹配&#xff08;LPM&#xff09;表查找方法&#xff0c;该方法通常用于在IP转发应用程序中找到最佳路由匹配。 2 LPM API概述 LPM组件实例的主要配置参数是要支持的最大规则数。 LPM前缀由一对参数&#xff08;32位Key&…