“面向目标值的排列匹配“和“面向目标值的背包组合问题“的区别和leetcode例题详解

1 目标值排列匹配

1.1 从目标字符串的角度来看,LC139是一个排列问题,因为最终目标子串的各个字符的顺序是固定的?

当我们从目标字符串 s 的角度来看 LC139 “单词拆分” 问题,确实可以认为它涉及到排列的概念,但这种排列是在一个更宏观的层面上,而不是在我们通常讨论组合和排列问题时所指的那种[参考1.4]。
在这里插入图片描述

1.1.1 排列的角度

在 “单词拆分” 问题中,目标字符串 s 的字符顺序是固定的。我们不能改变这些字符的顺序。我们的任务是确定是否可以通过字典中的单词(这些单词的内部字符顺序也是固定的)来构造出这个特定顺序的字符串。从这个角度看,确实涉及到了字符的“排列”——但这是指字符串 s 和字典中单词的内部字符顺序,而不是字典中单词作为整体的排列顺序。

1.1.2 组合的角度

然而,当我们讨论解决这个问题的算法时,我们通常将其视为一个组合问题。这是因为我们关心的是如何从字典中选择单词(并且可以重复选择)来构造字符串 s,而不是这些单词的选择顺序。我们可以以任何顺序检查和组合这些单词,只要它们最终能组合成目标字符串 s

1.1.3 动态规划的应用

在动态规划的应用中,我们通常关注的是如何逐步构建目标字符串,并在每一步检查是否可以使用字典中的单词来形成当前长度的子串。这种方法更侧重于组合(即哪些单词被选中来构造子串)而不是单词的选择顺序。

1.1.4 总结

因此,虽然从目标字符串 s 的角度来看,LC139 “单词拆分” 涉及到字符的排列,但在解决问题的算法层面,它更像是一个组合问题。这是因为我们关注的是如何从字典中选择单词来构造字符串 s,而不是这些单词的选择顺序。

1.3 例题一:爬楼梯

在这里插入图片描述

1.2.1 解析

这是一个面向目标值的排列问题,假如现在有一个三层楼梯,小明到达的方案有三种,如上图示例二所示,其中小明"先跳两级再跳一级"和"先跳一级再跳两级"是两种不同的方案(如果放到组合中这就是同一种组合),那么这就是一种面向目标值的排列问题,

1.2.2 答案

	// 泛化问题的答案,这里的j=2可以调整为j=k,表明"可以跳1到k级中的任意一级的楼梯"
    public int climbStairs(int n) {
        
        int[]f=new int[n+1];
        f[0]=1;
        f[1]=1;
        for(int i=2;i<=n;i++){
            int s=0;
            for(int j=1;j<=2;j++){
                s+=f[i-j];
            }
            f[i]=s;
        }
        return f[n];
    }

1.3 爬楼梯改编题

在这里插入图片描述

1.3.1 为什么这是一个“面向目标值的排列匹配”问题?

答:因为不同的排列方案,其代价不同,所以必然是一个排列问题,比如"从0到1花费10,从1跳2阶梯到3花费15",这种排列花费25,但是"从0到2花费20,从2跳1阶梯到3花费10",这种排列花费30.

1.3.2 答案

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int n=cost.length;
        if(n<2){
            return 0;
        }
        int[]f=new int[n+1];

        for(int i=2;i<=n;i++){
            f[i]=Math.min(f[i-1]+cost[i-1],f[i-2]+cost[i-2]);
        }

        return f[n];
    }
}

1.4 例题:Leetcode139. 单词拆分

在这里插入图片描述

1.4.1 这为什么是一个面向目标值的排列匹配问题?

以图中的例一为例,从单词列表中凑成leetcode本身要求leet在code之前,而不是满足任意顺序凑成就行,那么必然就是一个排列问题

1.4.2 答案

    public boolean wordBreak(String s, List<String> wordDict) {
        int n=s.length();
        char[]cs=s.toCharArray();
        int m=wordDict.size();

        HashSet<String>set=new HashSet<>(wordDict);
        boolean[]f=new boolean[n+1];
        f[0]=true;

        for(int i=1;i<=n;i++){
            for(int j=0;j<i;j++){
                if(f[j]&&set.contains(s.substring(j,i))){
                    f[i]=true;
                    break;
                }
            }
        }
        return f[n];
    }

1.5 关于LC单词拆分的其他变体问题

Leetcode139单词拆分及其多种变体问题

2 背包组合问题

基本上背包问题无论从目标值角度还是元素列表角度都是组合问题,因为背包只涉及到数量关系的满足,如果两个排列的数量关系相同,那么他们对问题的贡献值是一样的,可以视为一个同组合

2.1 以《lc 416. 分割等和子集》为例,可以发现背包问题只关注凑成的数量正确,对于排列的方式不关心,所以是一个组合问题

在这里插入图片描述

    public boolean canPartition(int[] nums) {
        int n=nums.length;
        int s=0;
        for(int i=0;i<n;i++){
            s+=nums[i];
        }
        if(s%2==1){
            return false;
        }
        boolean[]f=new boolean[s/2+1];
        f[0]=true;
        for(int i=0;i<n;i++){
            for(int j=s/2;j>=nums[i];j--){
                f[j]=f[j]||f[j-nums[i]];
            }
        }
        return f[s/2];

    }

2.2 leetcode题目集合

细数Leetcode上的背包问题

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ Qt 学习(四):自定义控件与 qss 应用

1. qss 简介 Qt style sheet&#xff08;qss&#xff0c;Qt 样式表&#xff09;&#xff0c;不需要用 C 代码控件进行重载&#xff0c;就可以修改控件外观&#xff0c;类似于前端的 css 2. qss 选择器 2.1 通配符选择器 /* 设置后控件窗口背景色都被修改为黄色 */ * {backg…

便捷Benchmark.sh 自动匹配workload(自用)

​ 因为db_bench选项太多&#xff0c;而测试纬度很难做到统一&#xff08;可能一个memtable大小的配置都会导致测试出来的写性能相关的的数据差异很大&#xff09;&#xff0c;所以官方给出了一个benchmark.sh脚本用来对各个workload进行测试。 该脚本能够将db_bench测试结果中…

深度解析NLP定义、应用与PyTorch实战

1. 概述 文本摘要是自然语言处理&#xff08;NLP&#xff09;的一个重要分支&#xff0c;其核心目的是提取文本中的关键信息&#xff0c;生成简短、凝练的内容摘要。这不仅有助于用户快速获取信息&#xff0c;还能有效地组织和归纳大量的文本数据。 1.1 什么是文本摘要&#x…

《詩經别解》——國風·周南·雎鳩​​​​​​​

一、关于古文的一个认识 目前可以阅读的古文经典&#xff0c;大多是经历了几千年的传承。期间的武力战争、文化纷争、宗教侵袭、官僚介入及文人的私人恩怨与流派桎梏&#xff0c;印刷与制作技术&#xff0c;导致这些古文全部都已经面目全非。简单地说&#xff0c;你读到的都是…

树与二叉树作业

1. 已知一个二叉树的中序遍历序列和后序遍历序列&#xff0c;求这棵树的前序遍历序列 【问题描述】 已知一个二叉树的中序遍历序列和后序遍历序列&#xff0c;求这棵树的前序遍历序列。 【输入形式】 一个树的中序遍历序列 该树后序遍历序列&#xff0c;中间用空格分开。输…

el-table实现展开当前行时收起上一行的功能

<el-tableref"tableRef":data"tableData":expand-row-keys"expandRowKeys":row-key"handleRowKey" // 必须指定 row-keyexpand-change"handleExpandChange" // 当用户对某一行展开或者关闭的时候会触发该事件> <…

Creo螺旋扫描/弹簧画法

一&#xff1a;点击螺旋扫描 二&#xff1a;参考–》螺旋轮廓的定义&#xff1a; 三、草绘轮廓线&#xff1a;视图放正 四、草绘弹簧丝线形状&#xff1a; 在非中轴线上画圆&#xff1a; 制螺旋线&#xff1a; 首先理清Creo绘制螺旋线的逻辑&#xff08;不同于UG直接给定直径…

华为ensp:边缘端口并启动BUDU保护

如上图前提是三个交换机都做了rstp&#xff0c;则在边缘的地方做 边缘端口并启动BUDU保护&#xff0c;也就是我用绿色圈出来的地方 边缘1 进入交换机的系统视图 interface e0/0/3 进入接口 stp edged-port enable quit 再退回系统视图 stp bpdu-protection 这样就可以了…

Arduino ESP8266使用AliyunIoTSDK.h连接阿里云物联网平台

文章目录 1、AliyunIoTSDK简介2、相关库安装3、阿里云创建产品&#xff0c;订阅发布4、对开源的Arduino ESP8266源代码修改5、使用阿里云点亮一个LED灯6、设备向阿里云上传温度数据7、项目源码 1、AliyunIoTSDK简介 AliyunIoTSDK是arduino的一个库&#xff0c;可以在arduino的…

20分钟搭建Ubertooth One开源蓝牙测试工具

kali linux 2023 安装依赖&#xff08;记得使用root用户搭建环境&#xff09; 1、apt-get update 2、apt install ubertooth 更新共享库缓存 3、ldconfig 安装 Ubertooth 工具和驱动程序 4、插入Ubertooth One工具 5、ubertooth-util -v 备注&#xff1a;出现Firmwate v…

Android系统开发快速寻找代码(如何在文件夹中寻找代码)

很多时候对于Android系统开发小白而言&#xff0c;例如预置APK&#xff0c;知道了APK包名不知道具体代码位置需要去寻找代码&#xff0c;但是Android系统代码十分庞大&#xff0c;如何快速准确查询代码是个问题。 本人目前只探索到了一些方法&#xff0c;如有更有效的办法可以…

CMOS介绍

1 二极管 2 CMOS 2.1 栅极、源极、漏极 2.2 内部结构 2.2 导电原理 - 原理&#xff1a;1.通过门级和衬底加一个垂直电场Ev&#xff0c;从而在两口井之间形成反形层2.如果加的电场足够强&#xff0c;反形层就可以把source&#xff08;源极&#xff09;和drain&#xff08;漏极…

UML软件建模软件StarUML mac中文版软件介绍

StarUML for mac是一款UML建模器&#xff0c;StarUML for mac提供了几个模版&#xff0c;帮助用户建立使用新的图表&#xff0c;是目前最流行的UML建模工具&#xff0c;给开发工作带来大大的便利。 StarUML mac软件介绍 StarUML 是一个流行的软件建模工具&#xff0c;用于创建…

【车载开发系列】AutoSar中的CANTP

【车载开发系列】AutoSar中的CANTP 【车载开发系列】AutoSar中的CANTP 【车载开发系列】AutoSar中的CANTP一. CANTP相关术语二. CANTP相关概念1&#xff09;单帧&#xff1a;SF(Single Frame)2&#xff09;首帧&#xff1a;FF(First Frame)3&#xff09;连续帧CF(Consecutive F…

原生微信小程序学习之旅(一) -来简单的使用

文章目录 取消导航栏标头组件创建添加Component组件接收传入的数据 页面创建(Page)关于tabBartabBar自定义样式 轮播图轮播图指示点样式改变 微信小程序快速获取用户信息路由跳转获取url路径中的参数 bindtap(click)传参wx:if编写用户登陆关于默认工程目前的获取方法尝试一下服…

python 中用opencv开发虚拟键盘------可以只选择一个单词不会出现一下选择多个

一. 介绍 OpenCV是最流行的计算机视觉任务库&#xff0c;它是用于机器学习、图像处理等的跨平台开源库&#xff0c;用于开发实时计算机视觉应用程序。 CVzone 是一个计算机视觉包&#xff0c;它使用 OpenCV 和 Media Pipe 库作为其核心&#xff0c;使我们易于运行&#xff0c…

Apache和Nginx实现虚拟主机的3种方式

目录 首先介绍一下Apache和nginx&#xff1a; Nginx和Apache的不同之处&#xff1a; 虚拟主机 准备工作 Apache实现&#xff1a; 方法1&#xff1a;使用不同的ip来实现 方法2&#xff1a;使用相同的ip&#xff0c;不同的端口来实现 方法3&#xff1a;使用相同的ip&…

解决游戏找不到x3daudio1_7.dll文件的5个方法,快速修复dll问题

在电脑使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“x3daudio1_7.dll丢失”。这个错误通常会导致软件游戏无法正常启动运行。为了解决这个问题&#xff0c;我们需要采取一些措施来修复丢失的文件。本文将详细介绍解决x3daudio1_7.dll丢失的方法…

企业云盘与个人云盘:区别与特点一览

企业云盘是企业在寻找文件协同工具的过程中绕不开的一个选项。企业为什么需要专门购置企业网盘&#xff0c;个人云盘能否满足企业的文件协作需求呢&#xff1f;企业云盘和个人云盘有什么区别呢&#xff1f; 企业云盘与个人云盘的区别 1、使用对象&#xff1a;顾名思义&#xf…

Java 简单实现一个 TCP 回显服务器

文章目录 TCP 服务端TCP 客户端实现效果TCP 服务端(实现字典功能)总结 TCP 服务端 package network;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Soc…