LeetCode 热题 100_单词拆分(86_139_中等_C++)(动态规划)

LeetCode 热题 100_单词拆分(86_139)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(动态规划):
      • 代码实现
        • 代码实现(思路一(动态规划)):
        • 以思路一为例进行调试

题目描述:

给你一个字符串 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 中的所有字符串 互不相同

题解:

解题思路:

思路一(动态规划):

1、此题的思想就是将字符串 s 进行切分,切分后的子串与 word 中的字符串进行比较,若切分后的子串都存在word中则返回true。判断子串是否存在word可以使用哈希集合来加速查找。在判断的时候有许多重复的地方我们可以想到动态规划来记录一段子串的结果。

2、具体思路如下:
① dp[i] 表示字符串 s[0…i-1] 是否能拆分成字典中的单词( i ∈ [ 0,s.size() ] )。
② 递推公式为 dp[i] = dp[j] && ( s[j,i−1] ∈ word_set )。

  • 对于每个位置 i,我们遍历 j(从 0 到 i-1),检查 dp[j] 是否为 true,即前 j 个字符已经能拆分为字典中的单词。
  • 如果 dp[j] 为 true 且 s[j, i-1](从位置 j 到 i-1 的子串)存在于字典中,那么 dp[i] 就可以设置为
    true,表示前 i 个字符能拆分为字典中的单词。

③ dp[0] = true,因dp[i] = dp[j] && ( s[j,i−1] ∈ word_set )。dp数组中其他值为false。
④ 最终返回 dp[s.size()]。

3、复杂度分析:
① 时间复杂度:O(n2) ,n 代表 s 中字符的个数,使用双重循环。
② 空间复杂度:O(n+m) ,m 是字典 wordDict 中单词的总数,dp 数组所消耗的空间为 O(n),哈希集合消耗的空间为 O(m)。

代码实现

代码实现(思路一(动态规划)):
class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {// 将 wordDict 转换为 unordered_set 以便快速查找unordered_set<string> word_set(wordDict.begin(), wordDict.end());// dp[i] 的含义是:前i个字符(s[0...i-1]),是否可由wordDict 字典中的单词组成vector<bool> dp(s.size() + 1, false);// 初始化 dp[0] 为 true,因递推公式 dp[i]=dp[j]&&check(s[j~i-1])dp[0] = true;//  判断前i个字符是否可由wordDict字典中的单词组成,i从 1 到 s.size()for (int i = 1; i <= s.size(); i++) {// 对于每个位置 i,检查是否存在一个 j 使得 s[j:i] 是字典中的一个单词for (int j = 0; j < i; j++) {// 如果前j个字符可以由字典中的单词组成,并且后i-j个字符是字典中的一个单词if (dp[j] && word_set.count(s.substr(j, i - j))) {// 如果满足条件,将 dp[i] 设置为 truedp[i] = true;// 一旦找到一个有效的拆分,就可以跳出内层循环break;}}}// 返回 dp[s.size()],表示整个字符串是否可以由字典中的单词组成return dp[s.size()];}
};
以思路一为例进行调试
#include<iostream>
#include<vector>
#include<unordered_set>
using namespace std;class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {// 将 wordDict 转换为 unordered_set 以便快速查找unordered_set<string> word_set(wordDict.begin(), wordDict.end());// dp[i] 的含义是:前i个字符(s[0...i-1]),是否可由wordDict 字典中的单词组成vector<bool> dp(s.size() + 1, false);// 初始化 dp[0] 为 true,因递推公式 dp[i]=dp[j]&&check(s[j~i-1])dp[0] = true;//  判断前i个字符是否可由wordDict字典中的单词组成,i从 1 到 s.size()for (int i = 1; i <= s.size(); i++) {// 对于每个位置 i,检查是否存在一个 j 使得 s[j:i] 是字典中的一个单词for (int j = 0; j < i; j++) {// 如果前j个字符可以由字典中的单词组成,并且后i-j个字符是字典中的一个单词if (dp[j] && word_set.count(s.substr(j, i - j))) {// 如果满足条件,将 dp[i] 设置为 truedp[i] = true;// 一旦找到一个有效的拆分,就可以跳出内层循环break;}}}// 返回 dp[s.size()],表示整个字符串是否可以由字典中的单词组成return dp[s.size()];}
};int main(int argc, char const *argv[])
{string s="leetcode";vector<string> wordDict={"leet", "code"};Solution s1;if (s1.wordBreak(s,wordDict)){cout<<"true"<<endl;}else{cout<<"false"<<endl;}return 0;
}

LeetCode 热题 100_单词拆分(86_139)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

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

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

相关文章

VM虚拟机安装及Ubuntu安装配置

VM虚拟机安装及Ubuntu安装配置 1、VM虚拟机安装2、创建虚拟机3、Ubuntu系统安装4、编译环境配置4.1 、Ubuntu和 Windows文件互传 文件互传4.1.1、 开启Ubunt下的FTP服务 4.2、 Ubuntu下NFS和SSH服务开启4.2.1、 NFS服务开启4.2.2、 SSH服务开启 4.3、 交叉编译器安装4.3.1 安装…

【KWDB 创作者计划】_产品技术解读_1

【KWDB 创作者计划】_产品技术解读_1 一、存储引擎:高性能混合存储架构1. 存储模型设计2. 存储压缩与编码3. 持久化策略二、KWDB 组件源码解析1. 核心模块分层架构2. 关键组件源码剖析三、KWDB 特性代码通读1. 实时分析能力(Real-Time OLAP)2. 混合负载隔离(HTAP)3. 智能索…

高速电路中的电阻、电容的选型及应用

2.1 电阻的应用 2.1.1 与电阻相关的经典案例 如果说芯片是电路的骨架&#xff0c;那么电阻就是在芯片之间起连接作用的关节。电阻的阻值、布放位置等&#xff0c;对设计的成功起着至关重要的作用。 【案例2.1】串联电阻过大&#xff0c;导致板间告警失败 某产品由业务板和主…

springBoot接入文心一言

文章目录 效果接入步骤项目接入配置类&#xff1a;WenXinYiYan前端vue代码js代码 后端mapper层service层controller层 测试代码 效果 先来看一下最后实现的效果 &#xff08;1&#xff09;未点击前的功能页面 &#xff08;2&#xff09;点击后的页面 &#xff08;3&#xff…

css解决边框四个角有颜色

效果 html <div class"gradient-corner">2021年</div>css background:/* 左上角横线 */linear-gradient(90deg, rgb(5, 150, 247) 9px, transparent 0) 0 0,/* 左上角竖线 */linear-gradient(0deg, rgb(5, 150, 247) 9px, transparent 0) 0 0,/* 右上…

自动化三维扫描:CASAIM外观尺寸智能检测

制造业向智能化、数字化加速转型&#xff0c;传统检测方式因效率低、精度差、数据断层等问题&#xff0c;已难以满足现代工业对精密测量与实时质控的需求。CASAIM依托前沿技术实力&#xff0c;以自动化三维扫描为核心&#xff0c;为工业检测提供了从数据采集到智能分析的全流程…

突破亚马逊壁垒,Web Unlocker API 助您轻松获取数据

目录 一、Web Unlocker API简介二、开始使用Web Unlocker API1、首先进入控制台页面&#xff0c;点击左侧第一个tab键“代理 & 抓取基础设施”&#xff0c;找到“网页解锁器”&#xff0c;开始使用。2、进入网页解锁器页面后&#xff0c;填写通道名称&#xff0c;添加简短描…

【力扣05】最长回文子串

0. 引言 ●子串(substring&#xff09;&#xff1a;原始字符串的一个连续子集; ●子序列&#xff08;subsequence&#xff09;&#xff1a;原始字符串的一个子集。 1. 什么叫回文串&#xff1f; 如果一个字符串正着读和反着读是一样的&#xff0c;那它就是回文串。[1] 例如&…

统计销量前十的订单

传入参数&#xff1a; 传入begin和end两个时间 返回参数 返回nameList和numberList两个String类型的列表 controller层 GetMapping("/top10")public Result<SalesTop10ReportVO> top10(DateTimeFormat(pattern "yyyy-MM-dd") LocalDate begin,Dat…

【HDFS入门】HDFS核心组件Secondary NameNode角色职责与运行机制解析

目录 1 Secondary NameNode的角色定位与常见误解 2 核心职责详解 2.1 核心功能职责 2.2 与NameNode的协作关系 3 运行机制深度剖析 3.1 检查点触发机制 3.2 元数据合并流程 4 与Hadoop 2.0 HA架构的对比 5 配置调优指南 5.1 关键配置参数 5.2 性能优化建议 6 实践应…

MySQL存储引擎:存储什么意思?引擎什么意思?存储引擎是什么?在MySQL中有什么作用?

MySQL存储引擎详解 一、术语解析 “存储”与“引擎”的汉语词典解释 1. 存储&#xff08;chǔ cn&#xff09; 汉语词典释义&#xff1a; • 动词&#xff1a; • 存放、保存&#xff08;将物品或信息放置在特定地方&#xff0c;以便后续使用&#xff09;。 ◦ 例&#xff…

测试第三课-------自动化测试相关

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

Hive null safe的用法

总结: null safe 是用<> 代表比较&#xff0c;而不是用 。null <> null 返回 true&#xff0c; 而 null null 代表 false。 NULL 和任意字符比较都返回 NULL&#xff0c;而不是 true 或者 false。如 SELECT 1 1, NULL NULL, 1 NULL;输出 true NULL NULL如果我…

LINUX基础 [四] - Linux工具

目录 软件包管理器yum Linux开发工具vim vim的基本概念 vim的三种常用模式 vim的简单配置 vim常用模式的基本操作 命令模式 底行模式 处理vim打开文件报错的问题 Linux编译器-gcc/g使用 为什么我们可以用C/C做开发呢&#xff1f; 预处理&#xff08;进行宏替换&#x…

RocketMQ 03

今天是2025/04/14 21:58 day 20 总路线请移步主页Java大纲相关文章 今天进行RocketMQ 6,7,8 个模块的归纳 最近在忙毕设&#xff0c;更新有点慢&#xff0c;见谅 首先是RocketMQ 的相关内容概括的思维导图 6. 安全机制 6.1 ACL 访问控制 核心功能 权限分级&#xff1a;通过…

深入理解浏览器的 Cookie:全面解析与实践指南

在现代 Web 开发中&#xff0c;Cookie 扮演着举足轻重的角色。它不仅用于管理用户会话、记录用户偏好&#xff0c;还在行为追踪、广告投放以及安全防护等诸多方面发挥着重要作用。随着互联网应用场景的不断丰富&#xff0c;Cookie 的使用和管理也日趋复杂&#xff0c;如何在保障…

在企业级部署中如何优化NVIDIA GPU和容器环境配置:最佳实践与常见误区20250414

在企业级部署中如何优化NVIDIA GPU和容器环境配置&#xff1a;最佳实践与常见误区 引言 随着AI和深度学习技术的迅速发展&#xff0c;企业对GPU加速计算的需求愈加迫切。在此过程中&#xff0c;如何高效地配置宿主机与容器化环境&#xff0c;特别是利用NVIDIA GPU和相关工具&…

【秣厉科技】LabVIEW工具包——OpenCV 教程(19):拾遗 - imgproc 基础操作(上)

文章目录 前言imgproc 基础操作&#xff08;上&#xff09;1. 颜色空间2. 直方图3. 二值化4. 腐蚀、膨胀、开闭运算5. 梯度与轮廓6. 简易绘图7. 重映射 总结 前言 需要下载安装OpenCV工具包的朋友&#xff0c;请前往 此处 &#xff1b;系统要求&#xff1a;Windows系统&#x…

Linux 下 Module 工具的介绍与使用

参考&#xff1a; https://www.fasteda.cn/post/22.html https://modules.readthedocs.io/en/latest/module.html Linux 下 Module 工具的介绍与使用 一、前言 在 Linux 中&#xff0c;当同一款编辑器、运行库、软件存在多个版本且多个版本都需要在不同的场景或人员使用时&a…

空间信息可视化——WebGIS前端实例(一)

技术栈&#xff1a;原生HTML 源代码&#xff1a;CUGLin/WebGIS: This is a project of Spatial information visualization 4 全国贫困县可视化系统 4.1 系统设计思想 党的十九大报告明确指出,要“确保到2020年我国现行标准下农村贫困人口实现脱贫,贫困县全部摘帽,解决区域…