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

news2025/4/21 14:14:10

题目链接: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数组推导的过程。

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

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

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

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

相关文章

深度盘点:2024年企业最喜欢用的WMS仓库管理系统有哪些?

本文将列举国内外知名的仓库管理系统&#xff0c;从每个系统的适用范围、核心功能、特点来为大家解读。为企业选型提供参考&#xff01; WMS系统是Warehouse Management System&#xff08;仓库管理系统&#xff09;的简称&#xff0c;它是一个帮助企业和仓库管理者高效管理仓库…

NMOS与PMOS原理图

重点关注续流二极管方向和电流流向&#xff1a; NMOS应用&#xff1a; PMOS 应用&#xff1a;

BASM引领2024国家网络安全宣传周:智能守护,打造全方位业务与应用安全监测平台

在这个信息泛滥的时代&#xff0c;网络安全已不再是可有可无的选项。 随着技术的飞速发展&#xff0c;新型网络攻击层出不穷&#xff0c;数据泄露、恶意攻击频发&#xff0c;保护个人与企业的数字安全显得尤为重要。 2024年国家网络安全宣传周期间&#xff0c;通付盾给大家带…

Cortex-R52+的PE mode详解--Abort

目录 1.R52 AArch32通用寄存器描述 2.Abort模式是什么 3.实例详解 1.R52 AArch32通用寄存器描述 上篇文章我们阐述了关于R52异常如何定位&#xff0c;其中详细说明了发生异常后应该在什么模式下去观察寄存器。 今天就以Abort异常为例&#xff0c;详解下如何精准定位Abort异…

一文读懂网络安全等级保护

网络安全等级保护&#xff08;简称“等保”&#xff09;是我国为了保护信息安全而推出的一项制度&#xff0c;旨在通过对信息系统分等级实施安全保护&#xff0c;确保信息安全。它涵盖了信息和存储、传输、处理这些信息的信息系统&#xff0c;以及使用的信息安全产品。等级保护…

素数筛的一个易错点

前言&#xff1a;之前运用素数筛的时候都没注意&#xff0c;一个不是素数的数可能会被反复标记为1 题目地址 #include <bits/stdc.h> using namespace std; #define int long longconst int N (int)3e7 10; int a[N]; int n;signed main() {// 1// 2 2 // 3 3// 4 2cin…

从100G到400G:利用多模光纤升级数据中心网络

数据中心网络的持续发展 数据中心网络的持续发展涵盖了两个关键方面。首先&#xff0c;必须应对由机器学习和物联网等数据密集型应用所带来的带宽和流量需求的增长挑战&#xff0c;这些应用正在推动现有10G和40G链路的升级&#xff1b;其次&#xff0c;为了满足日益提升的可持…

ARP:IP到MAC地址转换

网络中的ARP协议&#xff0c;它是IP地址到MAC地址转换的关键。通过ARP请求&#xff08;Req&#xff09;和响应&#xff08;Rsp&#xff09;&#xff0c;设备能够找到对应IP的物理地址&#xff0c;从而实现网络通信。 ARP req&#xff1a;广播 主机1mac:02:c2:c2:52:e5:e1 主机…

使用 Elastic 和 LM Studio 的 Herding Llama 3.1

作者&#xff1a;来自 Elastic Charles Davison, Julian Khalifa 最新的 LM Studio 0.3 更新使 Elastic 的安全 AI Assistant 能够更轻松、更快速地与 LM Studio 托管模型一起运行。在这篇博客中&#xff0c;Elastic 和 LM Studio 团队将向你展示如何在几分钟内开始使用。如果你…

顺风车 萝卜快跑!做人,什么是格局,什么是境界?——早读(逆天打工人爬取热门微信文章解读)

萝卜快跑&#xff01; 引言Python 代码第一篇 洞见 做人&#xff0c;什么是格局&#xff0c;什么是境界&#xff1f;第二篇 股市风云结尾 &#xff08;哈哈 订单已取消&#xff09; 引言 今天难受 把昨天买的票加入黑名单 太差了 早上一来低开4个多点 把我昨天的利润全没了 然…

微生物分类检测系统源码分享

微生物分类检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

代理服务器及其原理

代理服务器的代理可以分为正向代理和反向代理&#xff0c;本篇将讲解这两种代理方式的原理&#xff0c;以及对应的功能特点和应用场景。最后还对比和 NAT 和代理服务器的区别。 目录 正向代理 工作原理 功能特点 应用场景 反向代理 基本原理 应用场景 NAT和代理服务器…

mybatis-plu分页出现问题

还真能遇到版本导致的问题&#xff1a; mybatis-plus.使用分页插件出现count(),缺少* 查看你mybtis-plus的版本&#xff0c;将3.4.2换掉

Docker日志管理之Filebeat+ELK日志管理

所需安装包及镜像 安装步骤 把所需镜像导入到Docker容器 打开/etc/sysctl.conf配置文件&#xff0c;添加参数 打开资源限制配置文件&#xff0c;添加参数 创建一个网络 在根目录下创建一个项目目录 创建Elasticsearch子目录 在项目目录下创建Elasticsearch子目录 将安装Elast…

如何构建适合企业需求的即时通讯与音视频通话私有化平台?

在数字化转型的浪潮中&#xff0c;企业对于内部沟通的需求日益复杂化和多元化。传统的沟通方式已难以满足高效协作、信息安全及个性化定制的需求。因此&#xff0c;“即时通讯音视频通话”集成的私有化部署软件应运而生&#xff0c;成为企业优化内部沟通、提升工作效率的得力助…

如何在Linux虚拟机上安装和配置JDK

1. 下载jdk 首先&#xff0c;访问Oracle官方网站下载JDK安装包。这里以JDK 8为例&#xff1a; 1. 访问 Oracle JDK 下载页面。 Java Downloads | Oraclehttps://www.oracle.com/java/technologies/downloads/ 2. 选择合适的版本&#xff08;如JDK 8&#xff09;并下载适用于L…

VS code 写下 print 时让编译器自动添加括号

VS code 当写下 print 时让编译器自动添加括号 引言正文 引言 最近本人由于某些原因开始使用 VS code 编译器了&#xff0c;相较于 PyCharm 编译器&#xff0c;VS code 速度非常快&#xff0c;且占用空间少&#xff0c;extension 也很多&#xff0c;用户可以根据自己的喜好进行…

知识|智能网联汽车多域电子电气架构会如何发展?

摘要&#xff1a;随着汽车智能化和网联化技术的快速发展&#xff0c;传统的电子电气架构已经无法满足未来车路云网一体化发展的新需求。本文聚焦于未来智能网联汽车的多域电子电气架构&#xff0c;并从总体设计、硬件系统、通信系统和软件系统四个方面对现有技术进行了详细的综…

二叉树c++(level up)

目录 1.搜索二叉树 1.1概念 1.2操作 1.2.1.查找 1.2.2插入 1.2.3遍历 1.2.4删除&#xff08;重点&#xff09; 1.3K模型/KV模型 1.4性能分析 2.二叉树oj 1.创建字符串 2.层序遍历 3.二叉树的最近公共祖先 4.二叉搜索树与双向链表 5.前序中序构建二叉树 6.中序后续…

基于"WT2605C的智能血压计:AI对话引领个性化健康管理新时代,健康守护随时在线

在当今快节奏的生活中&#xff0c;健康管理已成为我们日常不可或缺的一部分。随着科技的进步&#xff0c;智能设备正逐步融入我们的日常生活&#xff0c;为健康管理带来前所未有的便捷与智能化。今天&#xff0c;让我们共同探索WT2605C AI在线方案如何在血压计中发挥革命性作用…