算法-动态规划/trie树-单词拆分
算法-动态规划/trie树-单词拆分
1 题目概述
1.1 题目出处
https://leetcode.cn/problems/word-break/description/?envType=study-plan-v2&envId=top-interview-150
1.2 题目描述

2 动态规划
2.1 解题思路
- dp[i]表示[0, i)字符串可否构建
- 那么dp[i]可构建的条件是,[0,j)可构建且[j,i)包含在wordDict中
- 这里你可能会问,那如果是[j,i)不能直接构建,而是有wordDict种的两个单词构建怎么办?其实,因为我们是从低到高构建的动态规划,所以设k > j 且 k <i,那么dp[k] = true,因为dp[j]=true且 [j,k)在wordDict中。那么 [k, i)就是剩下的那个单词了,所以 [j,i)也可以被构建。
2.2 代码
class Solution {public boolean wordBreak(String s, List<String> wordDict) {// dp[i]表示[0, i)字符串可否构建// 那么dp[i]可构建的条件是,[0,j)可构建且[j,i)包含在wordDict中boolean[] dp = new boolean[s.length() + 1];dp[0] = true;Set<String> set = new HashSet<>(wordDict);for (int i = 1; i <= s.length(); i++) {for (int j = 0; j < i; j++) {if (dp[j] == true && set.contains(s.substring(j, i))) {dp[i] = true;break;}}}return dp[s.length()];}
}
2.3 时间复杂度
O(c*s.length)

2.4 空间复杂度
O( s.length)
3 trie树
3.1 解题思路
- 将wordDict构建trie树
- 将s从位置0开始往后匹配查找
- 如果当前位置能匹配上,继续判断是否是单词结尾,如果是且下一个单词开始的匹配也能成功,就说明能构建,返回true
- 其他情况继续往后匹配
3.2 代码
class Solution {Trie root = new Trie();// 记忆数组,用来快速判定该位置是否可以作为单词结尾进行拆分构建boolean[] no = new boolean[300];public boolean wordBreak(String s, List<String> wordDict) {// 将所有word插入字典树for (String word : wordDict)root.insert(word);// 从0个字符开始往后查找,只要匹配成功说明可以构建目标字符串if (root.find(s, 0)) {return true;}return false;}class Trie{public Trie[] children = new Trie[26];// 当前child代表的字符是否是单词结尾boolean isEnd = false;public void insert(String word) {if (null == word || word.length() == 0) {isEnd = true;return;}int index = word.charAt(0) - 'a';Trie child = children[index];if (null == child) {child = new Trie();children[index] = child;}child.insert(word.substring(1));}public boolean find(String s, int i) {// 快速判定当前字符位置是否可以拆分构建// 注意这里必须判定当前节点是否是root,因为我们缓存是从根节点开始的// 否则会对其他child的正常判断过程造成误判if (this == root && no[i]) {return false;}char firstC = s.charAt(i);Trie child = children[firstC - 'a'];if (null == child) {// 如果不能匹配指定位置字符,肯定不可构建if (this == root) {no[i] = true;}return false;}if (child.isEnd) {// 如果能找到目标字符,且字符是单词结尾if (i + 1 == s.length()) {// 如果// 1.已经扫描到字符串最后的字符// 就说明当前位置可以用来拆分构建目标字符串return true;} else {if (root.find(s, i+1)) {// 如果下一个字符往后的字符串能构建// 就说明当前位置可以用来拆分构建目标字符串return true;} else {// 否则说明i+1字符虽是单词结尾,但无法直接拆分构建,记录下来no[i+1] = true;}}}if (i + 1 < s.length()) {// 还未到结尾,可以继续往后查找return child.find(s, i+1);} else {// 已到单词结尾,构建失败return false;}}}
}
3.3 时间复杂度

3.4 空间复杂度
O(s.length)
参考
- 循序渐进5种解法,从字典树trie回溯延伸到动态规划
相关文章:
算法-动态规划/trie树-单词拆分
算法-动态规划/trie树-单词拆分 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/word-break/description/?envTypestudy-plan-v2&envIdtop-interview-150 1.2 题目描述 2 动态规划 2.1 解题思路 dp[i]表示[0, i)字符串可否构建那么dp[i]可构建的条件是&…...
React框架核心原理
一、整体架构 三大核心库与对应的组件 history -> react-router -> react-router-dom react-router 可视为react-router-dom 的核心,里面封装了<Router>,<Route>,<Switch>等核心组件,实现了从路由的改变到组件的更新…...
python-pytorch 利用pytorch对堆叠自编码器进行训练和验证
利用pytorch对堆叠自编码器进行训练和验证 一、数据生成二、定义自编码器模型三、训练函数四、训练堆叠自编码器五、将已训练的自编码器级联六、微调整个堆叠自编码器 一、数据生成 随机生成一些数据来模拟训练和验证数据集: import torch# 随机生成数据 n_sample…...
制作 3 档可调灯程序编写
PWM 0~255 可以将数据映射到0 75 150 225 尽可能均匀电压间隔...
源码分享-M3U8数据流ts的AES-128解密并合并---GoLang实现
之前使用C语言实现了一次,见M3U8数据流ts的AES-128解密并合并。 学习了Go语言后,又用Go重新实现了一遍。源码如下,无第三方库依赖。 package mainimport ("crypto/aes""crypto/cipher""encoding/binary"&quo…...
CSDN Q: “这段代码算是在STC89C52RC51单片机上完成PWM呼吸灯了吗?“
这是 CSDN上的一个问题 这段代码算是在STC89C52RC51单片机上完成PWM呼吸灯了吗,还是说得用上定时器和中断函数#include <regx52.h> 我个人认为: 效果上来说, 是的! 码以 以Time / 100-Time 调 Duty, 而 for i loop成 Period, 加上延时, 实现了 PWM周期, 虽然…...
Linux系统编程系列之线程池
Linux系统编程系列(16篇管饱,吃货都投降了!) 1、Linux系统编程系列之进程基础 2、Linux系统编程系列之进程间通信(IPC)-信号 3、Linux系统编程系列之进程间通信(IPC)-管道 4、Linux系统编程系列之进程间通信-IPC对象 5、Linux系统…...
Linux CentOS7 vim多文件与多窗口操作
窗口是可视化的分割区域。Windows中窗口的概念与linux中基本相同。连接xshell就是在Windows中新建一个窗口。而vim打开一个文件默认创建一个窗口。同时,Vim打开一个文件也就会建立一个缓冲区,打开多个文件就会创建多个缓冲区。 本文讨论vim中打开多个文…...
SPI 通信协议
1. SPI通信 1. 什么是SPI通信协议 2. SPI的通信过程 在一开始会先把发送缓冲器的数据(8位)。一次性放到移位寄存器里。 移位寄存器会一位一位发送出去。但是要先放到锁存器里。然后从机来读取。从机的过程也一样。当移位寄存器的数据全部发送完。其实…...
【图像处理】使用各向异性滤波器和分割图像处理从MRI图像检测脑肿瘤(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
5个适合初学者的初级网络安全工作,网络安全就业必看
前言 网络安全涉及保护计算机系统、网络和数据免受未经授权的访问、破坏和盗窃 - 防止数字活动和数据访问的中断 - 同时也保护用户的资产和隐私。鉴于公共事业、医疗保健、金融以及联邦政府等行业的网络犯罪攻击不断升级,对网络专业人员的需求很高,这并…...
Kafka核心原理
1、Topic的分片和副本机制 分片作用: 解决单台节点容量有限的问题,节点多,效率提升,吞吐量提升。通过分片,将一个大的容器分解为多个小的容器,分布在不同的节点上,从而实现分布式存储。 分片…...
探秘前后端开发世界:猫头虎带你穿梭编程的繁忙街区,解锁全栈之路
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
洛谷_分支循环
p2433 问题 5 甲列火车长 260 米,每秒行 12 米;乙列火车长220 米,每秒行 20 米,两车相向而行,从两车车头相遇时开始计时,多长时间后两车车尾相离?已知答案是整数。 计算方式:两车车…...
MySQL数据库入门到精通——进阶篇(3)
黑马程序员 MySQL数据库入门到精通——进阶篇(3) 1. 锁1.1 锁-介绍1.2 锁-全局锁1.3 锁-表级锁1.3.1 表级锁-表锁1.3.2 表级锁元数据锁( meta data lock,MDL)1.3.3 表级锁-意向锁1.3.4 表级锁意向锁测试 1.4 锁-行级锁1.4.1 行级锁-行锁1.4.2…...
Mind Map:大语言模型中的知识图谱提示激发思维图10.1+10.2
知识图谱提示激发思维图 摘要介绍相关工作方法第一步:证据图挖掘第二步:证据图聚合第三步:LLM Mind Map推理 实验实验设置医学问答长对话问题使用KG的部分知识生成深入分析 总结 摘要 LLM通常在吸收新知识的能力、generation of hallucinati…...
[引擎开发] 杂谈ue4中的Vulkan
接触Vulkan大概也有大半年,概述一下自己这段时间了解到的东西。本文实际上是杂谈性质而非综述性质,带有严重的主观认知,因此并没有那么严谨。 使用Vulkan会带来什么呢?简单来说就是对底层更好的控制。这意味着我们能够有更多的手段…...
docker--redis容器部署及地理空间API的使用示例-II
文章目录 Redis 地理位置类型API命令操作示例JAVA使用示例导入依赖RedisTemplate 操作GeoData示例CityInfo实体类Geo操作接口类Geo操作接口实现类SpringBoot测试类RedissonClient 操作GeoData示例docker–redis容器部署及与SpringBoot整合 docker–redis容器部署及地理空间API的…...
Vue中如何进行文件浏览与文件管理
Vue中的文件浏览与文件管理 文件浏览与文件管理是许多Web应用程序中常见的功能之一。在Vue.js中,您可以轻松地实现文件浏览和管理功能,使您的应用程序更具交互性和可用性。本文将向您展示如何使用Vue.js构建文件浏览器和文件管理功能,以及如…...
jenkins利用插件Active Choices Plug-in达到联动显示或隐藏参数,且参数值可修改
1. 添加组件 Active Choices Plug-in 如jenkins无法联网,可在以下两个地址中下载插件,然后放到/home/jenkins/.jenkins/plugin下面重启jenkins即可 Active Choices Active Choices | Jenkins plugin 2. 效果如下: sharding为空时…...
使用gitee备份整个服务器数据
可以的,我给你说一套服务器上最标准、最稳妥的备份方案,专门针对你这种:/var/www 数据库 /etc/apache2 一起存到 Gitee 的场景。一、先说清楚:哪些要备份、哪些别乱备份1. 必须备份(你的网站核心)/var/ww…...
Qwen2.5-14B-Instruct部署案例:高校戏剧系用像素剧本圣殿教学实践
Qwen2.5-14B-Instruct部署案例:高校戏剧系用像素剧本圣殿教学实践 1. 项目背景与价值 在戏剧创作教学中,传统剧本创作方式面临诸多挑战:学生创意受限、格式不规范、修改成本高。某高校戏剧系引入基于Qwen2.5-14B-Instruct深度优化的"像…...
暗黑3一键宏终极指南:D3keyHelper让你的刷图效率翻倍
暗黑3一键宏终极指南:D3keyHelper让你的刷图效率翻倍 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 还在为暗黑3中重复的技能按键感到疲…...
百度网盘秒传链接网页工具终极指南:全平台免费极速转存方案
百度网盘秒传链接网页工具终极指南:全平台免费极速转存方案 【免费下载链接】baidupan-rapidupload 百度网盘秒传链接转存/生成/转换 网页工具 (全平台可用) 项目地址: https://gitcode.com/gh_mirrors/bai/baidupan-rapidupload 还在为百度网盘资源分享的繁…...
像素艺术×AI识别:Ostrakon-VL扫描终端CSS修复实战详解
像素艺术AI识别:Ostrakon-VL扫描终端CSS修复实战详解 1. 项目背景与设计理念 1.1 为什么选择像素艺术风格 在零售和餐饮场景中,传统的工业级UI往往显得冰冷且缺乏亲和力。我们选择8-bit像素艺术风格,主要基于三个考量: 降低技…...
告别驱动噩梦:在 Ubuntu 22.04 上为 RTX 5070 显卡手动编译安装驱动的完整心路历程
告别驱动噩梦:在 Ubuntu 22.04 上为 RTX 5070 显卡手动编译安装驱动的完整心路历程 1. 缘起:当官方驱动安装成为一场噩梦 那是一个普通的周末早晨,我满怀期待地拆开了刚到的RTX 5070显卡。作为一名长期使用Ubuntu进行深度学习开发的工程师&…...
揭秘Nunchaku FLUX.1 CustomV3工作流:LoRA融合技巧让图片细节更丰富
揭秘Nunchaku FLUX.1 CustomV3工作流:LoRA融合技巧让图片细节更丰富 你是否曾经看着别人用AI生成的图片,惊叹于那些纤毫毕现的发丝、细腻柔和的皮肤质感、以及充满故事感的光影细节,而自己用同样的模型却总感觉差了点什么?画面好…...
YOLOv8n-face:工业级人脸检测技术的精度与效率平衡之道
YOLOv8n-face:工业级人脸检测技术的精度与效率平衡之道 【免费下载链接】yolov8-face yolov8 face detection with landmark 项目地址: https://gitcode.com/gh_mirrors/yo/yolov8-face 一、行业痛点诊断:企业级人脸检测的现实挑战 1.1 复杂场景…...
【UE6.5 C++27 适配权威指南】:20年引擎老兵亲授7步零错误迁移法(含编译器链兼容性验证清单)
第一章:UE6.5 C27 适配的战略认知与前置准备Unreal Engine 6.5 对 C27 标准的初步支持标志着引擎底层工具链的重大演进。这一适配并非简单的编译器升级,而是涉及构建系统、反射机制、蓝图互操作性及内存模型兼容性的系统性重构。开发者需摒弃“仅更新编译…...
千问3.5-2B网页版深度解析:前端上传逻辑、后端推理链路、JSON返回结构
千问3.5-2B网页版深度解析:前端上传逻辑、后端推理链路、JSON返回结构 1. 平台概述 千问3.5-2B是Qwen系列中的轻量级视觉语言模型,专为图片理解与文本生成任务优化设计。这个开箱即用的解决方案将复杂的AI能力封装成简单的网页交互,用户无需…...
