【动态规划】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

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

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

相关文章

INS-GPS组合导航——卡尔曼滤波

系列文章目录 《SAR笔记-卫星轨道建模》 《SAR笔记-卫星轨迹&#xff08;三维建模&#xff09;》 《常用坐标系》 文章目录 前言 一、经典卡尔曼滤波 二、扩展卡尔曼滤波 三、无迹卡尔曼滤波 总结 前言 SAR成像仪器搭载于运动平台&#xff0c;平台的自定位误差将影响SAR…

LeetCode-Leetcode 1120:子树的最大平均值

LeetCode-Leetcode 1120&#xff1a;子树的最大平均值 题目描述&#xff1a;解题思路一&#xff1a;递归解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1a; 给你一棵二叉树的根节点 root&#xff0c;找出这棵树的 每一棵 子树的 平均值 中的 最大 值。 子…

还不知道工业以太网和现场总线区别???

工业以太网 工业以太网是一种专为工业环境设计的网络通信技术&#xff0c;它基于标准的以太网技术&#xff0c;但针对工业应用进行了优化。工业以太网能够适应高温、低温、防尘等恶劣工业环境&#xff0c;采用TCP/IP协议&#xff0c;与IEEE 802.3标准兼容&#xff0c;并在应用层…

Studying-代码随想录训练营day24| 93.复原IP地址、78.子集、90.子集II

第24天&#xff0c;回溯算法part03&#xff0c;牢记回溯三部曲&#xff0c;掌握树形结构结题方法&#x1f4aa; 目录 93.复原IP地址 78.子集 90.子集II 总结 93.复原IP地址 文档讲解&#xff1a;代码随想录复原IP地址 视频讲解&#xff1a;手撕复原IP地址 题目&#xff1…

如何利用python画出AHP-SWOT的战略四边形(四象限图)

在企业或产业发展的相关论文分析中&#xff0c;常用到AHP-SWOT法进行定量分析&#xff0c;形成判断矩阵后&#xff0c;如何构造整洁的战略四边形是分析的最后一个环节&#xff0c;本文现将相关代码发布如下&#xff1a; import mpl_toolkits.axisartist as axisartist import …

解决本机电脑只能通过localhost访问,不能通过127.0.0.1访问

背景问题 有天我启动项目&#xff0c;发现项目连接Mysq总是连接不上&#xff0c;查了url、ip、port、用户名和密码都没有错&#xff0c;就是连接不上mysql数据库&#xff0c;后来通过查找资料发现有多个进程占用3306端口。 pid 6016 是mysqld服务 而pid 9672 是一个叫 svchos…

逆变器--学习笔记(一)

并网&#xff1a; 逆变器中的“并网”指的是逆变器将其产生的交流电与电网同步&#xff0c;并输送到公共电网中。并网逆变器通常用于太阳能发电系统和其他分布式发电系统&#xff0c;将其产生的电能输送到电网供其他用户使用。 THD谐波失真总量: 逆变器的THD&#xff08;Tot…

大模型系列课程学习-基于2080TI-22G魔改卡搭建双卡大模型训练平台(双系统)

1.选择合适的硬件配置 再配置电脑之前&#xff0c;需要确认自己需要的显存大小、主板、内存条、电源、散热等核心配件。经过前期调研&#xff0c;选择的硬件配置如下&#xff1a; &#xff08;1&#xff09;主板&#xff1a;华南X99_F8D(DDR4主板)&#xff0c;因为需要支持双卡…

Python: PyCharm 2023.1 调试

1.设断点 &#xff08;行号对应的红色点&#xff0c;在需要设置断点的代码行与行号之间鼠标点击即可以设置&#xff09; 2.shiftF9,或 altshiftf9 选择文件 或是在菜单 Run->debug "main" 或是在菜单Run->debug 选择文件 &#xff08;鼠标光标放在设置第一个…

DDD学习笔记四

领域模型的构建 基础领域模型的基本组成有名称、属性、关联、职责、事件和异常 发掘领域概念3种策略&#xff1a; 1&#xff09;学习已有系统&#xff0c;重用已有模型 2&#xff09;使用分类标签。分类标签来源于领域&#xff0c;需要我们研究一些资料并做一些提炼。从采用5W…

基于elastic stack的docker-compose部署的ELK与LDAP集成

说明&#xff1a; ldap信息配置到es配置文件上&#xff0c;然后kibana读取es的配置信息 用户与角色的关系通过role_mapping.yml文件配置获取 角色与权限的关系通过elastic stack提供的DevTools或API进行维护 一、前置条件&#xff1a; 1.1 es已开启xpack&#xff08;已开启…

DIY智能音箱:基于STM32的低成本解决方案 (附详细教程)

摘要: 本文详细介绍了基于STM32的智能音箱的设计与实现过程&#xff0c;包括硬件设计、软件架构、语音识别、音乐播放等关键技术。通过图文并茂的方式&#xff0c;结合Mermaid流程图和代码示例&#xff0c;帮助读者深入理解智能音箱的工作原理&#xff0c;并提供实际操作指导。…

汇川CodeSysPLC教程03-2-10 如何组态

大家好&#xff0c;我是阿凡工控分享&#xff0c;本期我们将调整教程的顺序&#xff0c;和粉丝朋友们讨论后&#xff0c;后续我将优先出绿旗标注的部分&#xff0c;便于小白水平的你循序渐进&#xff0c;其他水平的朋友有些需求可能要稍后了&#xff0c;如果有问题请见谅&#…

【Spring成神之路】一次SpringIOC源码之旅,女朋友也成为了Spring大神!

文章目录 一、前言二、前置准备三、IOC容器的使用四、Spring IOC源码解读1. prepareRefresh源码解读2. obtainFreshBeanFactory源码解读2.1 refreshBeanFactory源码解读 3. prepareBeanFactory源码解读4. postProcessBeanFactory源码解读5. invokeBeanFactoryPostProcessors源码…

计算机Java项目|基于SpringBoot的作业管理系统设计与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、Python项目、前端项目、人工智能与大数据、简…

Lumos学习王佩丰Excel第三讲:查找替换定位

一、查找和替换 1、按值查找 2、按格式查找 将红色的单元格替换成黄色的单元格&#xff0c;其他格式同理处理。 3、是否开启单元格匹配 若不打开选项卡直接全部替换&#xff0c;会出现“苏州市市”的情况&#xff1b;加入单元格匹配的规则&#xff0c;检索时会以整个单元格内…

运维.Linux下执行定时任务(上:Cron简介与用法解析)

运维专题 Linux下执行定时任务&#xff08;上&#xff1a;Cron简介与用法解析&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAd…

AI陪伴产品的情感设计:从孤独感到恋爱感评分:9/10

本文主要阐述三个话题&#xff1a; 1. 市面上有哪些AI陪伴产品&#xff1f; 2. 我们团队要怎么做&#xff1f; 3. 为什么要做&#xff1f; 市面上有哪些陪伴类产品&#xff1f; Role-play&#xff08;角色扮演&#xff09; 在当前市场上&#xff0c;有不少以角色扮演为核心的…

灵魂拷问,如何应对平行志愿的天坑?

高考填报志愿实行平行志愿&#xff0c;关于这个概念这里不重复说&#xff0c;不了解平行志愿的可以百度补课&#xff0c;这里只说平行志愿的坑挖得实在太大了&#xff0c;以至于很多同学都入坑了&#xff0c;怎么办&#xff1f; &#xff08; 欢迎 评论区 咨询 and 交流....&am…

淀山湖之行随笔

我们仰望清新&#xff0c;但又不得不被世俗所伴。 近日上海开始进入梅雨季节&#xff0c;每天大大小小的雨水不断&#xff0c;整个环境也格外的潮湿&#xff0c;不过已经逐渐习惯这种气候&#xff0c;所谓的见怪不怪。 今日是周日&#xff0c;思绪好久&#xff0c;准备去淀山湖…