单词拆分[中等]

news2024/12/24 2:29:07

优质博文:IT-BLOG-CN
在这里插入图片描述

一、题目

给你一个字符串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
swordDict[i]仅由小写英文字母组成
wordDict中的所有字符串 互不相同

二、代码

方法一:动态规划

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

dp[i]=dp[j] && check(s[j..i−1])

其中 check(s[j…i−1]) 表示子串 s[j…i−1] 是否出现在字典中。

对于检查一个字符串是否出现在给定的字符串列表里一般可以考虑哈希表来快速判断,同时也可以做一些简单的剪枝,枚举分割点的时候倒着枚举,如果分割点 j 到 i 的长度已经大于字典列表里最长的单词的长度,那么就结束枚举,但是需要注意的是下面的代码给出的是不带剪枝的写法。

对于边界条件,我们定义 dp[0]=true 表示空串且合法。

有能力的读者也可以考虑怎么结合字典树 Trie 来实现,这里不再展开。

public class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        Set<String> wordDictSet = new HashSet(wordDict);
        boolean[] dp = new boolean[s.length() + 1];
        dp[0] = true;
        for (int i = 1; i <= s.length(); i++) {
            for (int j = 0; j < i; j++) {
                if (dp[j] && wordDictSet.contains(s.substring(j, i))) {
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[s.length()];
    }
}

时间复杂度: O(n^2) ,其中 n 为字符串 s 的长度。我们一共有 O(n) 个状态需要计算,每次计算需要枚举 O(n) 个分割点,哈希表判断一个字符串是否出现在给定的字符串列表需要 O(1) 的时间,因此总时间复杂度为 O(n^2)。

空间复杂度: O(n) ,其中 n 为字符串 s 的长度。我们需要 O(n) 的空间存放 dp 值以及哈希表亦需要 O(n) 的空间复杂度,因此总空间复杂度为 O(n)。

初始思路:我想的很简单,字符串从头开始遍历子字符串,遇到字典内有的单词则直接从字符串内删掉,最后看看是否整个字符串都能删完即可。代码如下:

public class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        if(wordDict.contains(s))
            return true;
        while(true){
            for(int i = 1; i <= s.length(); i++){
                if(wordDict.contains(s.substring(0, i))){
                    s = s.substring(i, s.length());
                    break;
                }
                if(i==s.length())
                    return false;
            }
            if(wordDict.contains(s))
                return true;
        }
    }
}

但是这么简单显然是错误的,没有考虑到如下的情况: s =“goalspecial” wordDict =[“go”,“goal”,“goals”,“special”] 当字符串中的一个子字符串包含有多个字典中的词,则需要考虑究竟要使用哪个词了。 研究了官方的题解后才理解了,官方使用dp[i]=true来表示s[i]之前的字符串可被字典完全替换。

if (dp[j] && wordDictSet.contains(s.substring(j, i))) {
                    dp[i] = true;
                    break;
                }

关于以上这段代码,条件dp[j] 的意思是s[0, j-1]的子字符串可被字典完全替换,而wordDictSet.contains(s.substring(j, i))的意思是字典内包含有字符串s[j, i-1]的词。 因此结合一下就是题解中说的如果前 0 到 j - 1 的子字符串合法,后面的 j 到 i - 1的子字符串也合法,那么加起来的[ 0 , i - 1 ]自然也合法。所以将dp[i]设为了true。 代码中不易理解的部分可能就是各种 i 和 j 的取值。外层for循环中的

for (int i = 1; i <= s.length(); i++)

是由于dp数组要得到最终的结果就要遍历完整个字符串,而dp[0]代表空串,所以自然要从1开始遍历到i==s.length(),而内层for循环中的

for (int j = 0; j < i; j++)

是为了不断寻找是否存在那么一个分割点j使得[0,j-1]的子字符串合法的同时s[ j , i - 1 ] 也合法,如果存在才将dp[i]设为true。

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

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

相关文章

【第54课】XSS跨站Cookie盗取表单劫持网络钓鱼溯源分析项目平台框架

免责声明 本文发布的工具和脚本&#xff0c;仅用作测试和学习研究&#xff0c;禁止用于商业用途&#xff0c;不能保证其合法性&#xff0c;准确性&#xff0c;完整性和有效性&#xff0c;请根据情况自行判断。 如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利&#xff0…

004、架构_计算节点

架构总览 重要线程 管理线程:主要负责元数据相关的管理,涉及启动、DDL、切换;执行线程:是CN最重要的核心线程组,涉及解析、执行计划、分发、聚合;路由线程:主要负责向DN节点分发语句,涉及读写分离、子语句;GTM代理线程:主要负责与GTM交互、涉及申请、活跃GTID查询、释…

YASKAWA机器人维修操作命令攻略-移动命令运用案例

移动命令 1. MOVJ 命令运用案例&#xff1a; MOVJ VJ50.00 PL2 NWAIT UNTIL IN(1)ON 含义&#xff1a;在这个点以关节坐标&#xff0c;按 50.00%的再现速度&#xff0c;定位精度为 2&#xff0c;同时执行下一条非移动 指令&#xff0c;判断输入信号 1 为 on 后&#xff0c;执行…

助力航运管理数字智能化,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建江面河道运输场景下来往航行船只自动检测识别系统

在全球化浪潮的推动下&#xff0c;物流行业作为连接世界的桥梁&#xff0c;其快速发展与进化不仅重塑了国际贸易的格局&#xff0c;更深刻影响着全球贸易金融的进程。其中&#xff0c;海运作为大宗商品跨国、全球化贸易的支柱性运输方式&#xff0c;其重要性不言而喻。随着各国…

ios去水印软件免费版,精选五大高效工具,告别水印烦恼!

随着社交媒体的普及&#xff0c;越来越多的人喜欢在网络上分享自己的生活点滴。在分享视频时&#xff0c;水印往往会影响美观。为了帮助大家解决这个问题&#xff0c;本文为您推荐五大高效免费的iOS去水印软件&#xff0c;让您轻松告别水印烦恼&#xff01; 软件一&#xff1a…

第137天:横向移动-Linux_ssh工具杂项Linux靶场环境搭建

实验环境及图解&#xff1a; 通过网盘分享的文件&#xff1a;137-Linux内网环境镜像文件 链接: https://pan.baidu.com/s/1W_5DvhbkGYMqML4mi1rjQA?pwdad6r 提取码: ad6r 一般情况下SSH密钥存放在~/.ssh/目录下&#xff0c;也可以文件中搜索已保存的SSH凭证 ~/.ssh/config ~/.…

eclipse下载安装与配置代码补全与中文版

eclipse下载安装与配置中文版 eclipse下载eclipse安装eclipse配置代码补全eclipse配置中文版 eclipse下载 首先我们从官网下载eclipse&#xff0c;点击后是如下页面 我们往下滑&#xff0c;选择自己需要的版本&#xff0c;在这里我们选择的是Windows的Java开发版本&#xff0c…

【自动驾驶】决策规划算法 | 数学基础(二)凸优化与非凸优化

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

机器学习||笔记

在学习机器学习之前&#xff0c;应具备以下基础&#xff1a; 编程技能&#xff1a;精通 Python&#xff0c;掌握数据结构、函数、面向对象编程&#xff0c;熟悉 Git 和 Jupyter Notebook。 数学基础&#xff1a; 线性代数&#xff1a;矩阵运算、特征值与特征向量。微积分&…

2009年

一、选择 B C D B A 答案 C 叶子节点可能出现在最下层和次下层 所以最多七层&#xff0c;前六层是满二叉树 C 答案 B A D A B 二、大题

JVM垃圾回收算法以及垃圾收集器

JVM垃圾回收算法 JVM垃圾回收算法分为三类&#xff1a;标记清除算法、标记整理算法、 复制算法 标记清除算法 垃圾回收分为2个阶段,分别是标记和清除,效率高有磁盘碎片,内存不连续 标记整理算法 标记清除算法一样,将存活对象都向内存另一端移动,然后清理边界以外的垃圾,无…

Windows 11系统 Eclipse 2024版本安装教程和环境搭建

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 Eclipse 是一个开源的集成开发环境 (IDE)&#xff0c;主要用于 Java 开发&#xff0c;但也支持其他编程语言如 C、Python 和 PHP。它提供了丰富的工具和插件&#xff0c;用于编写、调试和管理代码&#x…

【时时三省】(C语言基础)指针进阶4

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 阅读两段有趣的代码: 代码1: (*(void(*)())0)(); 意思是调用0地址处的函数 该函数无参&#xff0c;返回类型是void 1.void(*)()&#xff0d;函数指针 2.(void(*)())0&#xff0d;对0进…

Python编码系列—Python中的安全密码存储与验证:实战指南

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

基于SSM+JSP的手机商城系统网站

系统背景 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于网上手机商城所牵扯的管理及数据保存都是非常多的&#xff0c;例如管理员&#xff1b;主页、个人中心、用户管理、商品分类管理、商品信息管理、系统管理、订单管理&#xff0c;用户&#xff1b;主页、个人…

快速了解Git服务器端基础及基本操作命令(一)

&#x1f600;前言 本篇博文是关于Git服务器端的一些基础使用及基本操作命令&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意…

力扣面试150 插入区间 模拟

Problem: 57. 插入区间 &#x1f468;‍&#x1f3eb; 代码随想录 模拟 ⏰ 时间复杂度&#xff1a; O ( n ) O(n) O(n) class Solution {public int[][] insert(int[][] intervals, int[] newInterval) {int idx 0;List<int[]> res new ArrayList<>();while (…

如何用Hive进行高校考试分析:大数据技术提升教育质量

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

论文的AI含量检测靠谱吗

近年来&#xff0c;随着AI技术的飞速发展&#xff0c;越来越多的人开始关注AI在写作领域的应用&#xff0c;尤其是在学术论文中的应用。然而&#xff0c;这也催生了一些新的服务&#xff0c;如“AI含量检测”&#xff0c;声称能够检测论文中是否存在AI生成的内容。这些服务往往…

理想自动驾驶技术:探索双系统架构,自动驾驶锁定第一梯队

1、 无图 NOA 全量推送&#xff0c;向 One Model 进发 理想全国无图 NOA 全量推送实现快速追赶。理想 2021 年开始自研自动驾驶&#xff0c;并于2021 年 12 月落地高速 NOA 功能&#xff0c;进展处于国内领先水平&#xff0c;而蔚来、小鹏分别在 2020年 10 月、2021 年 1 月落…