当前位置: 首页 > news >正文

力扣139-单词拆分(Java详细题解)

题目链接:139. 单词拆分 - 力扣(LeetCode)

前情提要:

因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。

最近刚学完背包,所以现在的题解都是以背包问题为基础再来写的。

如果大家不懂背包问题的话,建议可以去学一学01背包和完全背包。

如果大家感兴趣,我后期可以出一篇专门讲解背包问题。

dp五部曲。

1.确定dp数组和i下标的含义。

2.确定递推公式。

3.dp初始化。

4.确定dp的遍历顺序。

5.如果没有ac打印dp数组 利于debug。

每一个dp题目如果都用这五步分析清楚,那么这道题就能解出来了。

这里下文统一使用一维dp数组。

题目思路:

本题题目描述比较清晰,给了我们一个非空字符串s和一个字符串列表wordDict作为字典,要求我们利用wordDict里的字符串来拼接出s,能拼接返回true,不能拼接返回false。wordDict中的字符串可以使用多次。

看完这个题目描述,是不是能够联想到完全背包。

其实wordDict的字符串就可以抽象为完全背包问题中的物品,s就是背包。

那么该题就可以转化为能不能将背包中的容量拆分,拆分分配到各个物品上,如果刚好能拆分完(也就是看能不能将背包装满)

但这里因为s是一个字符串,所以我们用字符串的长度作为背包容量。

话不多说,我们直接开始动规五部曲。

1.确定dp数组和i下标的含义。

我们最后结果要输出什么,就怎么定义dp数组。

字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。

2.确定递推公式。

该题的递推公式与之前的有些不同,之前的是把每一个物品装入到我们的背包中。

但该题因为是字符串,装入有点难,所以换一种思路,我们将背包进行拆分,将背包容量(字符串s)拆分为一个个物品(wordDict字典里的字符串),如果能拆分成功就return true,如果不能就return false。

如果此时我们的dp[j] 为 true的话,那说明字符串长度为j的s是可以拆分为一个或者多个字典中出现的单词,那么我们就只用再判断[j,i]这段区域是否也能拆分为字典中出现的单词,如果能拆分那么dp[i]就为true。

所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。

3.dp初始化。

本题的初始化不能从题目描述中得出。得从递推公式中推出。

有递推公式可以看出,dp[i] 都是由 dp[j - i]推出,所以我们当前的状态是由前面的状态推出。

那我们的dp[0]就必须初始化为true,如果初始化为false的话后面推出来的都是false。

4.确定dp的遍历顺序。

该题的遍历顺序也有一定讲究,举个例子。

s = "leetcode", wordDict = ["leet", "code"]

这个s只能先拆分为leet 再拆分为 code。换句话说s只能先由leet组成再加上code。所以该物品是有顺序的。

如果没有顺序那可能会组成codeleet,这并不是我们要的结果。

在完全背包问题中,先遍历物品后遍历背包求的是物品的组合。

先遍历背包后遍历物品求的是物品的排列。

组合是无顺序的,排列是有顺序的,所以本题要先先遍历背包后遍历物品。

5.如果没有ac打印dp数组 利于debug。

在这里插入图片描述

最终代码:

class Solution {public boolean wordBreak(String s, List<String> wordDict) {//本题要求将背包装满,如果能装满返回true 不能装满返回false//利用一个hash结构来快速查找[j,i]只否能在wordDict中查到HashSet<String> set = new HashSet<>(wordDict);//定义dp数组boolean [] dp = new boolean [s.length() + 1];//dp初始化dp[0] = true;//该题其实是求一个排列 所以需要先遍历背包 后遍历物品for(int i = 1;i <= s.length();i ++){for(int j = 0;j < i;j ++){//我们要判断[j i]就是物品,我们要判断该物品是否出现在我们的字典里if(set.contains(s.substring(j,i)) && dp[j]){dp[i] = true;}}}return dp[s.length()];}
}

dp类的题目如果想加深理解,我建议大家手动模拟一下dp数组推导的过程。

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!

相关文章:

力扣139-单词拆分(Java详细题解)

题目链接&#xff1a;139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 最近刚学完背包&#xff0c;所以现在的题解都是以背包问题为基础再来写的。 如果大家不懂背包问题的话&#…...

CSS —— display属性

用于指定一个元素在页面中的显示方式 HTML中标签元素大体被分为三种类型&#xff1a;块元素、行内元素和行内块元素 块元素 &#xff1a;block 1.独占一行 2.水平方向&#xff0c;占满它父元素的可用空间&#xff08;宽度是父级的100%&#xff09; 3.垂直方向&#xff0c;占据的…...

BTC ETF资金流入暴涨400%,市场下一步将如何发展?

近期&#xff0c;BTC现货ETF&#xff08;交易所交易基金&#xff09;市场出现了显著的资金流入&#xff0c;尤其是在9月10日&#xff0c;BTC ETF吸引了近1.17亿美元的资金流入&#xff0c;相较于前一天的3729万美元&#xff0c;暴涨了400%。这种现象引发了市场广泛关注&#xf…...

视频监控管理平台LntonAIServer视频智能分析抖动检测算法应用场景

在视频监控系统中&#xff0c;视频画面的稳定性对于确保监控效果至关重要。抖动现象是指视频画面中存在不稳定或频繁晃动的情况&#xff0c;这可能会影响视频的清晰度和可读性。LntonAIServer通过引入抖动检测功能&#xff0c;帮助用户及时发现并解决视频流中的抖动问题&#x…...

初识php库管理工具composer的体验【爽】使用phpword模板功能替换里面的字符串文本

需求&#xff1a; 做了一个租赁的项目&#xff0c;里面要求签署个人授权协议&#xff0c;里面要填写姓名&#xff0c;手机号&#xff0c;身份证号&#xff0c;签署日期等参数&#xff0c;格式如下图 格式&#xff1a; 如上图&#xff0c;word中的字符串模板变量使用${varname…...

每日一问:C++ 如何实现继承、封装和多态

每日一问&#xff1a;C 如何实现继承、封装和多态 C 是一门面向对象编程语言&#xff0c;通过继承、封装和多态这三个核心特性实现了对复杂系统的高效管理和扩展。继承让代码重用性得以提升&#xff0c;封装保护数据的完整性&#xff0c;而多态通过不同的接口实现了灵活性。本文…...

STM32常用数据采集滤波算法

例如&#xff0c;STM32进行滤波处理时&#xff0c;主要目的是处理数据采集过程中可能产生的噪声和尖刺信号。这些噪声可能来自电源干扰、传感器自身的不稳定性或其他外部因素。 1.一阶互补滤波 方法&#xff1a;取a0~1,本次滤波结果&#xff08;1-a&#xff09;本次采样值a上…...

二分系列(二分查找)9/12

一、分情况讨论 1.左闭右闭:[left,right] 因为是左闭右闭&#xff0c;所以left和right都能直接取到。 #这里将>放到一起&#xff0c;当nums[mid]>target的时候&#xff0c; 要更新右边界&#xff0c;rightmid-1,这样就把一些相同的情况也切出去了 可以理解为找的第一个…...

如何通过可视化大屏,助力智慧城市的“城市微脑”建设?

在智慧城市的宏伟蓝图中&#xff0c;常常面临着一个关键挑战&#xff1a;如何确保这些理念和技术能够真正地惠及城市的每一个角落&#xff0c;每一个产业&#xff0c;以及每一位市民。问题的核心在于城市的具体应用场景&#xff0c;无论是横向的社区、园区、镇街、学校、酒店、…...

何时空仓库

某仓库现存货物 s 箱&#xff0c;每天上午出货 m 箱、下午进货 n 箱&#xff0c;若s≥m>n≥0&#xff0c;则第 k 天将会出现空仓的情况。请你帮仓库管理员编写程序&#xff0c;输入s、m 和 n&#xff0c;计算并输出 k。 输入格式 s,m,n (s≥m>n≥0) 输出格式 k 输入样例…...

美创获评CNVD年度原创漏洞发现贡献单位!

9月10日&#xff0c;第21届中国网络安全年会暨网络安全协同治理分论坛在广州成功举办。会上&#xff0c;美创科技首次获评“CNVD年度原创漏洞发现贡献单位”。 美创科技依托第59号安全实验室&#xff0c;专注数据安全技术和攻防研究。凭借深厚的技术积累与优势&#xff0c;被遴…...

Spring 循环依赖原理及解决方案

一、什么是循环依赖 循环依赖指的是一个实例或多个实例存在相互依赖的关系&#xff08;类之间循环嵌套引用&#xff09;。 举例&#xff1a; Component public class AService {// A中注入了BAutowiredprivate BService bService; }Component public class BService {// B中也…...

【数据结构与算法 | 灵神题单 | 插入链表篇】力扣2807, LCR 029, 147

1. 力扣2807&#xff1a;在链表中插入最大公约数 1.1 题目&#xff1a; 你一个链表的头 head &#xff0c;每个结点包含一个整数值。 在相邻结点之间&#xff0c;请你插入一个新的结点&#xff0c;结点值为这两个相邻结点值的 最大公约数 。 请你返回插入之后的链表。 两个…...

瑞芯微rv1126 Linux 系统,修改系统时区,包有效方法

在 Linux 系统中,修改时区的步骤通常包括创建符号链接到正确的时区文件,并确保相关的配置文件已正确更新。然而,某些系统可能有额外的步骤或需要修改其他配置文件来使更改生效。以下是一些步骤。 1. 创建符号链接 ln -sf /usr/share/zoneinfo/Asia/Hong_Kong /etc/localti…...

系统架构设计师:数据库设计

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师:数据库设计前言数据库基础概念数据模型三要素数据库的三级模型和两级…...

代码随想录刷题day31丨56. 合并区间,738.单调递增的数字,总结

代码随想录刷题day31丨56. 合并区间&#xff0c;738.单调递增的数字&#xff0c;总结 1.题目 1.1合并区间 题目链接&#xff1a;56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 视频讲解&#xff1a;贪心算法&#xff0c;合并区间有细节&#xff01;LeetCode&#x…...

深圳建站公司-如何做网站

深圳建站公司&#xff1a;如何制作一个成功的网站 在信息化快速发展的今天&#xff0c;企业和个人越来越重视网络形象&#xff0c;网站成为了展示品牌、推广产品和服务的重要平台。深圳作为科技创新和经济发展的前沿城市&#xff0c;涌现出许多专业的建站公司&#xff0c;能够为…...

Google Earth Engine(GEE)——随时间推移的降雨趋势案例分析(大规模气候监测)

简介 探索 Google Earth Engine环境类型中不同的数据。到目前为止,我们主要使用光学卫星数据,并探索了植被随时间和空间的趋势。然而,仅仅跟踪植被特性的变化并不足以了解是什么驱动了它们——我们需要能够将这些动态与其他环境数据联系起来。 在交互式 GEE 控制台中为您感…...

从新手到高手:用这9个策略让ChatGPT成为你的私人顾问!

ChatGPT已经出来快一年多了&#xff0c;但是我发现周围的小伙伴还是处在调戏ChatGPT的阶段&#xff0c;并没有在日常工作和生活中发挥他应由的价值。我调研下来发现最关键的痛点就是&#xff1a;不知道该怎么写Prompt可以让ChatGPT输出期望的回答。 哎吆&#xff0c;这不正是撞…...

高精度定位系统中的关键技术:GGA、EHP、RTMC、IMU、GNSS、INS 和 RTK 的协同工作

文章目录 0. 概述1. GGA&#xff1a;标准的定位数据格式2. EHP&#xff1a;增强高度精度3. RTMC&#xff1a;实时监控与控制4. IMU 和 INS&#xff1a;惯性测量和导航系统5. GNSS&#xff1a;全球导航卫星系统6. RTK&#xff1a;实时动态差分定位7. 各技术的融合与协同GPS 数据…...

Spring3~~~

目录 多例 后置处理器BeanPostProcessor XML配置 通过注解 AOP与后置处理器 JdbcTemplate jdbc.properties jdbc.xml Test 具名参数 DAO 声明式事务 GoodsDao GoodsService xml 传播机制 种类 隔离级别 超时回滚 如果是普通的java项目&#xff0c;xml文件放…...

微服务CI/CD实践(五)Jenkins Docker 自动化构建部署Java微服务

微服务CI/CD实践系列&#xff1a; 微服务CI/CD实践&#xff08;一&#xff09;环境准备及虚拟机创建 微服务CI/CD实践&#xff08;二&#xff09;服务器先决准备 微服务CI/CD实践&#xff08;三&#xff09;Jenkins部署及环境配置 微服务CI/CD实践&#xff08;四&#xff09;…...

泰州高新区法院多层面强化固定资产管理

固定资产管理是法院的一项基础性工作&#xff0c;法院经费支出相当一部分用于固定资产的购置&#xff0c;为了提高固定资产使用质效&#xff0c;为执法办案提供坚实的保障&#xff0c;高新区法院积极探索科学合理的固定资产管理策略&#xff0c;更新管理思想&#xff0c;完善管…...

JDBC简介与应用:Java数据库连接的核心概念和技术

简短介绍 JDBC 及其重要性。 简短介绍 JDBC JDBC&#xff08;Java Database Connectivity&#xff09;是一种用于执行 SQL 语句的 Java API 并且独立于特定的数据库厂商。它允许开发者以一种标准的方式从 Java 应用程序中访问关系型数据库&#xff0c;这意味着一旦你掌握了 J…...

倒反天罡!这个AI风格模型可自由训练,还能批量生成同风格图像

在AIGC的新纪元中&#xff0c;模型已晋升为与算力并驾齐驱的生产力核心要素。也有不少用户反馈提到&#xff0c;如何利用神采PromeAI训练属于自己的风格模型&#xff1f;这需求必须安排&#xff01;神采PromeAI「一致性模型」正式上线&#xff01; 可自主训练风格化模型&#x…...

Stable Diffusion绘画 | ControlNet应用-Inpaint(局部重绘):更完美的重绘

Inpaint(局部重绘) 相当于小号的AI版PS&#xff0c;不但可以进行局部画面的修改&#xff0c;还可以去除背景中多余的内容&#xff0c;或者是四周画面内容的扩充。 预处理器说明 Inpaint_Global_Harmonious&#xff1a;重绘-全局融合算法&#xff0c;会对整个图片的画面和色调…...

电网谐波越限怎么处理

当电网中的谐波超出限值时&#xff0c;需要采取有效措施来处理和减少谐波&#xff0c;以保护电力系统的设备&#xff0c;确保电力质量。以下是处理电网谐波越限的主要措施&#xff1a; 1、谐波分析 监测与检测&#xff1a;使用谐波分析仪或功率质量分析仪监测谐波含量&#x…...

Redis中的AOF重写过程及其实际应用

引言 在Redis中&#xff0c;持久化是确保数据安全和稳定运行的关键部分。Redis提供了两种持久化方式&#xff1a;RDB快照和AOF&#xff08;Append Only File&#xff09;日志。相比RDB快照&#xff0c;AOF能够更频繁地保存数据变更&#xff0c;并且在服务器崩溃后能够更快地恢…...

JVM面试

1 黑马 1.1 什么是JVM 定义&#xff1a;JVM 就是java虚拟机&#xff0c;是运行在系统中的应用程序。它运行java的字节码文件&#xff0c;除了java还支持其他语言。作用&#xff1a;它主要作用就是实现java的代码一次编码&#xff0c;到处运行。实现java代码的跨平台性。功能&…...

【模板的特殊继承关系】 奇异的递归模板模式

一、奇异的递归模板模式范例 奇异的递归模板模式 ( C u r i o u s l y R e c u r r i n g T e m p l a t e P a t t e r n ) (Curiously \ Recurring \ Template \ Pattern) (Curiously Recurring Template Pattern)不是一种新技术&#xff0c;而是一种模板编程中使用的编程手…...