【动态规划】139. 单词拆分
139. 单词拆分
难度:中等
力扣地址:https://leetcode.cn/problems/word-break/description/

问题描述
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
示例 1:
输入: s = “leetcode”, wordDict = [“leet”, “code”]
输出: true
解释: 返回 true 因为 “leetcode” 可以由 “leet” 和 “code” 拼接成。
示例 2:
输入: s = “applepenapple”, wordDict = [“apple”, “pen”]
输出: true
解释: 返回 true 因为 “applepenapple” 可以由 “apple” “pen” “apple” 拼接成。
注意,你可以重复使用字典中的单词。
示例 3:
输入: s = “catsandog”, wordDict = [“cats”, “dog”, “sand”, “and”, “cat”]
输出: false
提示:
- 1 <= s.length <= 300
- 1 <= wordDict.length <= 1000
- 1 <= wordDict[i].length <= 20
- s 和 wordDict[i] 仅由小写英文字母组成 wordDict 中的所有字符串 互不相同
问题分析
套公式(完全背包)之前,需要先回顾一下完全背包问题,并结合本道题内容进行适配。

接着我们回顾一下完全背包问题的求解过程,这个非常基础,也非常重要。

理解完全背包问题以后,接下来就是真的套公式了,最关键的地方还是在于如何定义状态转移方程,这个过程也比较难,需要理解题目的意思,并且清楚状态转移的条件。

解题代码
分析在前面已经进行介绍,这里我们逐行解释代码的作用,如果有任何疑问,欢迎后面留言。
C++ 解题代码
class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {// 将字典中的单词存储到 unordered_set 中以加快查找速度unordered_set<string> wordSet(wordDict.begin(), wordDict.end());// 动态规划数组 dp,其中 dp[i] 表示 s 的前 i 个字符是否可以被拆分成字典中的单词vector<bool> dp(s.size() + 1, false);// 初始化:空字符串总是可以被拆分的dp[0] = true; // 遍历字符串 s 的每一个字符位置 ifor (int i = 1; i <= s.size(); ++i) {// 检查从 j 到 i 的子字符串 s[j:i] 是否在字典中for (int j = 0; j < i; ++j) {string target = s.substr(j, i - j);// 如果 dp[j] 为 true,且目标子串在字典中if (dp[j] && wordSet.find(target) != wordSet.end()) {// 则将 dp[i] 设为 true,表示前 i 个字符可以被拆分dp[i] = true;// 找到一个合法的拆分,跳出内层循环break;}}}// 返回 dp[s.size()],表示整个字符串 s 是否可以被拆分成字典中的单词return dp[s.size()];}
};
对应的 Java 版本为:
class Solution {public boolean wordBreak(String s, List<String> wordDict) {// 将字典中的单词存储到 HashSet 中以加快查找速度Set<String> wordSet = new HashSet<>(wordDict);// 动态规划数组 dp,其中 dp[i] 表示 s 的前 i 个字符是否可以被拆分成字典中的单词boolean[] dp = new boolean[s.length() + 1];// 初始化:空字符串总是可以被拆分的dp[0] = true;// 遍历字符串 s 的每一个字符位置 ifor (int i = 1; i <= s.length(); ++i) {// 检查从 j 到 i 的子字符串 s[j:i] 是否在字典中for (int j = 0; j < i; ++j) {String target = s.substring(j, i);// 如果 dp[j] 为 true,且目标子串在字典中if (dp[j] && wordSet.contains(target)) {// 则将 dp[i] 设为 true,表示前 i 个字符可以被拆分dp[i] = true;// 找到一个合法的拆分,跳出内层循环break;}}}// 返回 dp[s.length()],表示整个字符串 s 是否可以被拆分成字典中的单词return dp[s.length()];}
}
对应的python版本代码为:
class Solution:def wordBreak(self, s: str, wordDict: list[str]) -> bool:# 将字典中的单词存储到 set 中以加快查找速度wordSet = set(wordDict)# 动态规划数组 dp,其中 dp[i] 表示 s 的前 i 个字符是否可以被拆分成字典中的单词dp = [False] * (len(s) + 1)# 初始化:空字符串总是可以被拆分的dp[0] = True# 遍历字符串 s 的每一个字符位置 ifor i in range(1, len(s) + 1):# 检查从 j 到 i 的子字符串 s[j:i] 是否在字典中for j in range(i):target = s[j:i]# 如果 dp[j] 为 True,且目标子串在字典中if dp[j] and target in wordSet:# 则将 dp[i] 设为 True,表示前 i 个字符可以被拆分dp[i] = True# 找到一个合法的拆分,跳出内层循环break# 返回 dp[len(s)],表示整个字符串 s 是否可以被拆分成字典中的单词return dp[len(s)]
总结
本次例子中我们不再通过若干个例子介绍拆分过程,主要强调如何套公式,但是这些都是建立在对原版的完全背包问题熟悉的基础上,如果对完全背包问题不太熟悉,建议参考本博客中介绍的完全背包问题 4 步解题法,接着再套到这个题中理解。
Smileyan
2024.06.30 20:37
相关文章:
【动态规划】139. 单词拆分
139. 单词拆分 难度:中等 力扣地址:https://leetcode.cn/problems/word-break/description/ 问题描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意:不要求字…...
【C++】空指针访问成员函数
空指针访问成员函数 C中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针 如果用到this指针,需要加以判断保证代码的健壮性 class Animal { public:void fun1() {//正常的成员函数}void fun2() {if (this NULL) {return;//如果没有这个…...
Linux的IO易错点总结
本文主要记录IO的一些易错操作。 阻塞IO和非阻塞IO,一般都是针对数据读取的,因为write是主动行为,不存在阻塞这一说。 非阻塞式IO,一般都要配合while轮询来读取数据。 IO多路复用 当只检测一路IO的时候,和普通IO的作…...
【Android面试八股文】说一说你对Android中的Context的理解吧
文章目录 一、Context是什么?1.1 主要功能和用途1.2 如何获取 Context 实例?1.3 注意事项二、Context 类的层次结构三、Context的数量四、Context的注意事项五、Android 中有多少类型的 Context,它们有什么区别 ?六、Contextlmpl实例是什么时候生成的,在 Activity 的 oncr…...
AI在音乐创作中的角色:创造还是毁灭?
目录 一、基本情况介绍 二、近期新闻 三、AI生成音乐方面的商业模式 四、人工智能和音乐人可能的合作模式 五、人们如何借助AI来创作音乐 六、人工智能在创意产业引发的伦理道德问题 七、如何平衡技术发展与提高人类创造积极性的关系? 总结 一、基本情况介绍…...
[深入理解DDR] 总目录
依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR》 蓝色的是传送门,点击链接即可到达指定文章。 图。 DDR 分类 导论 [RAM] DRAM 导论:DDR4 | DDR5 | LPDDR5 | GDRR6 | HBM 应运而生 运存与内存?内存与存…...
模板方法模式在金融业务中的应用及其框架实现
引言 模板方法模式(Template Method Pattern)是一种行为设计模式,它在一个方法中定义一个算法的框架,而将一些步骤的实现延迟到子类中。模板方法允许子类在不改变算法结构的情况下重新定义算法的某些步骤。在金融业务中ÿ…...
leetcode347.前k个高频元素
leetcode347.前k个高频元素 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2] 示例 2: 输入: nums [1], k 1 输出: [1] 优先队列法 struct hash_…...
c++(二)
1. 类和对象 1.1. 封装 封装的意义 将属性和行为作为一个整体,表现生活中的事物;将属性和行为加以权限控制 public -> 公共权限:类内可以访问,类外也可以访问protected -> 保护权限:类内可以访问,…...
基于PHP的初中数学题库管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的初中数学题库管理系统 一 介绍 此初中数学题库管理系统基于原生PHP开发,数据库mysql,系统角色分为学生,教师和管理员。(附带参考设计文档) 技术栈:phpmysqlphpstudyvscode 二 功能 …...
WDG看门狗
1 WDG 1.1 简介 WDG是看门狗定时器(Watchdog Timer)的缩写,它是一种用于计算机和嵌入式系统中的定时器,用来检测和恢复系统故障。 看门狗就像是一个忠诚的宠物狗,它时刻盯着你的程序,确保它们正常运行。…...
zabbix server client 安装配置
Zabbix Server 采用源码包部署,数据库采用 MySQL8.0 版本,zabbix-web 使用 nginxphp 来实现。具体信息如下: 软件名 版本 安装方式 Zabbix Server 6.0.3 源码安装 Zabbix Agent 6.0.3 源码安装 MySQL 8.0.28 yum安装 Nginx 1.20…...
Unity关于Addressables.Release释放资源内存问题
前言 最近在编写基于Addressables的资源管理器,对于资源释放模块配合MemoryProfiler进行了测试,下面总结下测试Addressables.Release的结论。 总结 使用Addressables.Release释放资源时,通过MemoryProfiler检查内存信息发现加载的内容还在…...
运算放大器(运放)带宽和带宽平坦度
运算放大器带宽和带宽平坦度 电压反馈型运算放大器的带宽 下图1显示电压反馈型运算放大器的开环频率响应。有两种可能:图1A是最常见的情况,高直流增益以6dB/倍频程从极低频率下降至单位增益,也就是典型的单极点响应。相比之下,图…...
npm常用命令使用与事件案例
概述 npm(Node Package Manager)是一个JavaScript编程语言的包管理器,用于Node.js应用程序。它允许用户安装、共享和管理具有重复使用价值的代码(包),这些代码可以是库、工具或应用程序。 npm常用命令详解…...
Spring Boot中的定时任务调度
Spring Boot中的定时任务调度 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨如何在Spring Boot应用中实现定时任务调度,这在实际…...
Hadoop3:MapReduce中的ETL(数据清洗)
一、概念说明 “ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程。ETL一词较常用在数据仓库&#…...
python解锁图片相似度的神奇力量
在这个信息爆炸的时代,图片成为了我们传递信息、表达情感和记录生活的重要方式。然而,面对海量的图片资源,如何快速准确地找到相似的图片,成为了一个亟待解决的问题。现在,让我们为您揭开图片相似度的神秘面纱,带您领略这一创新技术的魅力! 图片相似度技术,就像是一位…...
TensorFlow 的原理与使用
文章目录 TensorFlow 的基本原理1. 计算图(Computation Graph)2. 张量(Tensor)3. 会话(Session)4. 自动微分(Automatic Differentiation) TensorFlow 的使用安装 TensorFlow基本使用…...
[数据库]事务的隔离级别存储引擎
事务的隔离级别 存储引擎 举例 myisam 进行回滚操作后可以发现有一个警告没有行受到影响 memory 比如用于qq的在线离线状态...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
