单词拆分(LeetCode-139)

简介: 单词拆分(LeetCode-139)

7. 单词拆分(LeetCode-139)


题目

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。


**注意:**不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。


示例 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 中的所有字符串 互不相同


思路

不会,卡尔哥的也没看懂。然后发现官方题解很清晰


我们定义 dp[i] 表示字符串 s 前 i 个字符组成的字符串s[0~i−1] 是否能被空格拆分成若干个字典中出现的单词。从前往后计算考虑转移方程,每次转移的时候我们需要枚举包含位置 i-1 的最后一个单词,看它是否出现在字典中以及除去这部分的字符串是否合法即可。公式化来说,我们需要枚举 s[0~i-1] 中的分割点 j ,看 s[0~j-1] 组成的字符串 S 1 (默认 j = 0 时 S 1 为空串)和 s[j~i-1] 组成的字符串 S 2 S_2S 2 是否都合法,如果两个字符串均合法,那么按照定义 S 1和 S 22拼接成的字符串也同样合法。由于计算到 dp[i] 时我们已经计算出了 dp[0~i−1] 的值,因此字符串 S 1 是否合法可以直接由 dp[j] 得知,剩下的我们只需要看 S 2 是否合法即可,因此我们可以得出如下转移方程

d p [ i ] = d p [ j ] & & c h e c k ( s [ j ∼ i − 1 ] )


五部曲


dp[i] 含义


表示字符串前 i 个字符组成的字符串s[0~i−1] 是否能被空格拆分成若干个字典中出现的单词

递推公式


d p [ i ] = d p [ j ] & & c h e c k ( s [ j ∼ i − 1 ] )


数组初始化


dp[0]=true 表示字符串为空,但题目中说了“给定⼀个非空字符串 s” 所以测试数据中不会出现i为0的情况,那么dp[0]初始为true完全就是为了推导公式。下标非0的dp[i]初始化为false,只要没有被覆盖说明都是不可拆分为⼀个或多个在字典中出现的单词。

遍历顺序


实在是没看懂,直接复制卡尔哥的原话了


题⽬中说是拆分为⼀个或多个在字典中出现的单词,所以这是完全背包。

还要讨论两层for循环的前后循序。

如果求组合数就是外层for循环遍历物品,内层for遍历背包。

如果求排列数就是外层for遍历背包,内层for循环遍历物品。

本题最终要求的是是否都出现过,所以对出现单词集合⾥的元素是组合还是排列,并不在意!

那么本题使⽤求排列的⽅式,还是求组合的⽅式都可以。

即:外层for循环遍历物品,内层for遍历背包 或者 外层for遍历背包,内层for循环遍历物品 都是可以的。


但本题还有特殊性,因为是要求⼦串,最好是遍历背包放在外循环,将遍历物品放在内循环。如果要是外层for循环遍历物品,内层for遍历背包,就需要把所有的⼦串都预先放在⼀个容器⾥。(如果不理解的话,可以⾃⼰尝试这么写⼀写就理解了)所以最终我选择的遍历顺序为:遍历背包放在外循环,将遍历物品放在内循环。内循环从前到后。


测试用例



代码展示

class Solution
{
public:
    bool wordBreak(string s, vector<string> &wordDict)
    {
        unordered_set<string> wordset(wordDict.begin(), wordDict.end());
        vector<bool> dp(s.size() + 1, false);
        dp[0] = true;
        for (int i = 0; i <= s.size(); i++)
        {
            for (int j = 0; j < i; j++)
            {
                if (dp[j] && wordset.find(s.substr(j, i - j)) != wordset.end())
                {
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[s.size()];
    }
};
目录
相关文章
|
8月前
|
安全 网络安全 开发工具
vulnhub靶机实战_DC-2
本文介绍了DC-2靶机的渗透测试实战过程,涵盖靶机下载、环境搭建、信息扫描、漏洞利用、权限提升及最终提权获取flag的完整流程。内容包括使用nmap扫描、WPScan和Hydra工具爆破登录信息,绕过rbash限制,利用git提权等关键技术步骤。
751 0
|
7月前
|
自然语言处理 数据可视化 PyTorch
19_Word2Vec详解:训练你的词嵌入
在自然语言处理(NLP)领域,如何将词语转换为计算机可理解的数值表示一直是核心挑战之一。从早期的one-hot编码到如今的预训练语言模型嵌入,词表示技术经历了革命性的演变。其中,Word2Vec作为2013年由Google提出的开创性模型,为现代词嵌入技术奠定了基础。尽管在2025年,我们已经拥有了更多先进的词嵌入方法,但Word2Vec依然是理解词向量本质和深度学习文本表示的重要基石。
293 0
|
12月前
|
分布式计算 Java Scala
【赵渝强老师】Scala编程语言
Scala 是一种集成面向对象与函数式编程特性的多范式语言,运行于 Java 平台并兼容 Java 程序。学习 Scala 为掌握 Spark 和 Flink 打下基础。本文通过视频讲解及代码示例,展示如何用 Scala 在 Spark 和 Flink 中实现 WordCount 程序,包括环境配置、数据处理及输出操作,帮助理解其实际应用。
213 19
|
传感器 安全 Java
《从头开始学java,一天一个知识点》之:循环结构:for与while循环的使用场景
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白
402 22
|
人工智能 自然语言处理 运维
新员工培训全攻略:从战略解码到实战落地的深度拆解
当航天科工七〇六所通过InfoQ的“线上+线下混合式培训”将200名新员工的岗位胜任周期缩短40%,当某芯片巨头用“铸造成长·一苇可航”主题培训将企业文化转化率达78%,我们不得不思考:在AI重构生产关系的今天,如何让培训计划既承载战略意图,又点燃个体价值?
|
自然语言处理 安全 测试技术
基于大模型的应用的测试的一些注意事项
大模型应用测试需注意三大冲突:时间敏感性冲突,即模型数据可能随时间变得过时;数据真实性冲突,指训练数据中可能存在虚假信息,影响模型准确性;数据一致性冲突,表现为模型对语义相同但句法不同的输入反应不一。测试时应针对这些问题设计用例,确保模型性能。
714 4
|
算法
数据结构之文件系统模拟(树数据结构)
本文介绍了文件系统模拟及其核心概念,包括树状数据结构、节点结构、文件系统类和相关操作。通过构建虚拟环境,模拟文件的创建、删除、移动、搜索等操作,展示了文件系统的基本功能和性能。代码示例演示了这些操作的具体实现,包括文件和目录的创建、移动和删除。文章还讨论了该算法的优势和局限性,如灵活性高但节点移除效率低等问题。
366 0
Uma
|
SQL MySQL 关系型数据库
【实操手册】如何玩转跨库Join?跨数据库实例查询应用实践
企业选择对其在线业务数据库进行拆分,或选择不同数据库类型以满足其业务需求。业务数据被“散落”在各个地方,如何方便地对这些数据进行汇总关联查询,已经成为困扰用户的一大难题
Uma
6530 156
|
Cloud Native 关系型数据库 MySQL
windows系统 安装nacos服务注册与发现中心
windows系统 安装nacos服务注册与发现中心
624 0
windows系统 安装nacos服务注册与发现中心
|
消息中间件 存储 监控
Redis精通系列——Stream
Redis精通系列——Stream
785 0
Redis精通系列——Stream