LeetCode题练习与总结:单词拆分--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. 初始化动态规划数组

  • 创建一个布尔数组 dp,长度为 s.length() + 1
  • 将 dp[0] 设置为 true,因为空字符串可以被看作是由空单词列表拼接而成。

2. 填充动态规划数组

  • 遍历字符串 s 的每个可能的结束位置 i,从 1 到 s.length()
  • 对于每个 i,再进行一次内部循环,遍历所有可能的前一个位置 j,从 0 到 i-1
  • 在内部循环中,检查 dp[j] 是否为 true,且 s.substring(j, i) 是否在字典 wordDict 中。
  • 如果上述条件成立,说明从 j 到 i 的子串可以被字典中的单词拼接而成,因此将 dp[i] 设置为 true

3. 返回结果

  • 动态规划数组填充完毕后,dp[s.length()] 的值即为所求,它表示整个字符串 s 是否可以被字典中的单词拼接而成。
  • 返回 dp[s.length()] 作为函数的输出。

这个动态规划解法的核心思想是将大问题分解为小问题,通过检查所有可能的前缀来逐步构建出整个字符串是否可以被拼接的答案。

三、具体代码

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class Solution {public boolean wordBreak(String s, List<String> wordDict) {Set<String> wordSet = 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] && wordSet.contains(s.substring(j, i))) {dp[i] = true;break;}}}return dp[s.length()];}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 将列表 wordDict 转换为哈希集合 wordSet 的时间复杂度是 O(k),其中 k 是字典中单词的数量。这是因为需要对每个单词进行哈希运算。
  • 初始化布尔数组 dp 的时间复杂度是 O(n),其中 n 是字符串 s 的长度。
  • 双层循环的时间复杂度是 O(n^2),因为外层循环执行了 n 次,内层循环在最坏情况下也可能执行 n 次。
  • substring 操作的时间复杂度是 O(k),其中 k 是子字符串的长度。在最坏情况下,k 可以达到 n,但通常情况下,k 会有一个上限,即字典中最长单词的长度。

综上所述,总的时间复杂度是 O(n^2 * m),其中 m 是字典中单词的平均长度。这是因为对于每个子字符串,我们需要检查它是否在字典中,这个操作的时间复杂度是 O(m)。

2. 空间复杂度
  • 哈希集合 wordSet 的空间复杂度是 O(k),其中 k 是字典中单词的数量。
  • 布尔数组 dp 的空间复杂度是 O(n),其中 n 是字符串 s 的长度。

因此,总的空间复杂度是 O(n + k),即由动态规划数组和哈希集合构成的空间需求。

五、总结知识点

  1. 动态规划:这是一种算法设计技术,用于解决优化问题。它将问题分解为更小的子问题,并通过组合子问题的解来解决原始问题。在这个问题中,dp 数组用于存储子问题的解,即字符串的前缀是否可以被字典中的单词拼接而成。

  2. 哈希集合HashSet 是 Java 中的一个集合实现,用于存储不重复的元素,并且可以快速判断一个元素是否存在于集合中。在这个问题中,wordSet 用于存储字典中的单词,以便快速检查一个子字符串是否是字典中的单词。

  3. 字符串操作substring 方法是 Java String 类的一个方法,用于提取字符串中的一个子串。在这个问题中,它用于提取从位置 j 到 i 的子字符串,检查它是否在字典中。

  4. 数组的初始化:代码中使用 new boolean[s.length() + 1] 初始化了一个布尔数组 dp,所有元素默认为 false。然后,dp[0] 被显式设置为 true,因为空字符串可以被看作是由空单词列表拼接而成。

  5. 双层循环:外层循环遍历字符串 s 的每个可能的结束位置 i,内层循环遍历所有可能的前一个位置 j。这种结构用于填充动态规划数组 dp

  6. 递推关系:动态规划的核心是找到子问题之间的递推关系。在这个问题中,dp[i] 的值取决于 dp[j]j < i)的值和子字符串 s.substring(j, i) 是否在字典中。

  7. 边界条件:在动态规划中,通常需要设置边界条件。在这个问题中,dp[0] 被设置为 true,这是递推的起始条件。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

vant组件 顶部下拉刷新和页面底部下拉获取数据+顶部搜索框

1.html部分&#xff08;顶部tab切换无&#xff0c;只有主体list部分&#xff09; <div class"yd" ><!-- yd端 --><!-- 搜索框 --><van-searchv-model"ydsearchvalue"show-actionplaceholder"请输入搜索关键词"search"…

JavaEE之HTTP协议(1)_HTTP基础知识,HTTP 请求、响应格式,方法,状态码

一、HTTP协议 1.1 基本概念: HTTP全称超文本传输协议&#xff0c;是一种无状态的、应用层的协议&#xff0c;它基于请求/响应模型。客户端&#xff08;通常是Web浏览器&#xff09;通过发送HTTP请求到服务器来获取或发送信息&#xff0c;服务器则返回HTTP响应作为回应。HTTP协…

shell (三)shell脚本

SHELL脚本 编程语言的分类 解释型语言&#xff1a;shell&#xff0c;Python&#xff0c;需要解析器 编译型语言&#xff1a;C语言&#xff0c;C&#xff0c;需要编译器 shell脚本 操作系统的结构 shell&#xff08;贝壳&#xff09; 应用层 app&#xff0c;代码 应用层需要通…

2024年软件测试面试题大全【答案+文档】

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、面试基础题 简述测试流程&#xff1a; 1、阅读相关技术文档&#xff08;如产品PRD、UI设计…

1、线性回归模型

1、主要解决问题类型 1.1 预测分析(Prediction) 线性回归可以用来预测一个变量(通常称为因变量或响应变量)的值,基于一个或多个输入变量(自变量或预测变量)。例如,根据房屋的面积、位置等因素预测房价。 1.2 异常检测(Outlier Detection) 线性回归可以帮助识别数…

鸿蒙开发系统基础能力:【@ohos.systemTime (设置系统时间)】

设置系统时间 本模块用来设置、获取当前系统时间&#xff0c;设置、获取当前系统日期和设置、获取当前系统时区。 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import systemTime …

沙盒在数据防泄密领域意义

在信息化快速发展的今天&#xff0c;数据已成为企业最宝贵的资产之一。然而&#xff0c;数据泄密事件频发&#xff0c;给企业的安全和发展带来了巨大威胁。SDC沙盒防泄密系统&#xff0c;作为一种创新的数据防泄密解决方案&#xff0c;正逐渐在数据防泄密领域发挥着越来越重要的…

理解和使用JavaScript的闭包

闭包 在前端开发中&#xff0c;JavaScript是一种非常重要的编程语言。它的灵活性和强大功能使得开发者可以创建丰富的用户体验。然而&#xff0c;JavaScript中有些概念对于初学者来说可能比较难以理解&#xff0c;闭包就是其中之一。本文将深入探讨JavaScript中的闭包&#xf…

安装zabbix时报错Could not resolve host: mirrors.huaweicloud.com;Unknown error解决办法

目录 1、问题原因 2、解决办法 3、知识拓展 DNS的区别 DNS配置文件解析 域名解析过程 4、书籍推荐 当安装Zabbix server&#xff0c;Web前端&#xff0c;agent时出现&#xff1a; [rootsc-zabbix-server ~]# yum install zabbix-server-mysql zabbix-agent安装过程中会出…

Python3极简教程(一小时学完)上

开始 Python 之旅 本教程基于 Python for you and me 教程翻译制作&#xff0c;其中参考了 Python tutorial 和 _The Python Standard Library_&#xff0c;并对原教程的内容进行了改进与补充。 相关链接地址如下&#xff1a; _Python tutorial_&#xff1a;Python 入门指南…

数字孪生流域:定义、组成等

数字孪生流域&#xff1a;定义、组成等 1 数字孪生流域&#xff08;Digital Twin Basin/Watershed&#xff09;总则1.1 定义1.2 适用范围1.3 建设目标1.4 建设原则 2 数字孪生流域框架与组成2.1 数字孪生流域框架2.2 数字孪生流域组成2.2.1 数字孪生平台2.2.2 信息化基础设施 3…

类的装饰器

1 使用类定义装饰器 class Person(object):def __init__(self):self._age 0propertydef age(self):return self._ageage.setterdef age(self,newValue):print(触发了吗)self._age newValuep Person() print(p.age) # 0 p.age 20 print(p.age) # 20 2 类属性 class Pe…

JavaScript学习笔记(二)

12、数字 常规用法和java的用法相似&#xff0c;就不再做详细的记录, JavaScript 数字 以下只记录特殊用法&#xff1a; 12.1 数字字符串运算 在所有数字运算中&#xff0c;JavaScript 会尝试将字符串转换为数字&#xff1a; var x "100"; var y "10"…

探索QCS6490目标检测AI应用开发(一):Yolov8n模型转换及量化

目标检测&#xff08;Object Detection&#xff09;是计算机视觉领域的核心任务之一&#xff0c;它旨在识别图像中的物体并确定其位置&#xff0c;在本期的文章中&#xff0c;我们用一个端到端的目标检测AI应用为例子。介绍如何在QCS6490 Ubuntu系统上实现一个目标检测应用开发…

第 5 章理解 ScrollView 并构建 Carousel UI

通过上一章的学习,我相信你现在应该明白如何使用堆栈构建复杂的 UI。当然,在你掌握 SwiftUI 之前,你还需要大量的练习。因此,在深入研究 ScrollView 以使视图可滚动之前,让我们先以一个挑战开始本章。你的任务是创建一个类似于图 1 所示的卡片视图。 …

如何迁移R包

迁移R包涉及将一个或多个R包从一个系统转移到另一个系统。以下是迁移R包的详细步骤&#xff1a; 1. 确定要迁移的R包 首先&#xff0c;列出你在当前系统中安装的所有R包&#xff0c;或仅列出你需要迁移的R包。你可以使用以下代码列出所有安装的R包&#xff1a; installed_pa…

swp添加池子addLiquidity失败

案发现场 首次添加交易对、一直失败、但是也没提示具体的原因。到这一步就没了、由下图可知、也没看到log、由此可见第一步就失败了。 解决方案 一、添加 工厂KywFactory 添加如下 bytes32 public constant INIT_CODE_PAIR_HASH keccak256(abi.encodePacked(type(KywPair…

移植对话框MFC

VC版 MFC程序对话框资源移植 以下均拷贝自上面&#xff0c;仅用来记录 &#xff08;部分有删除&#xff09; 法1&#xff1a; Eg&#xff1a;将B工程调试好的对话框移植到A工程中 1.资源移植 1.1 在2017打开B工程,在工作区Resource标签页中选中Dialog文件夹下的资源文件,按…

注意!短视频的致命误区,云微客教你避开!

为什么你做短视频就是干不过同行&#xff1f;因为你总想着拍剧情、段子这些娱乐视频&#xff0c;还想着当网红做IP人设&#xff0c;但是这些内容跟你的盈利没有半毛钱关系&#xff0c;况且难度大、见效慢&#xff0c;还不是精准客户。 以上这些就代表你走进了短视频的误区&…

C++初学者指南-2.输入和输出---流输入和输出

C初学者指南-2.输入和输出—流输入和输出 文章目录 C初学者指南-2.输入和输出---流输入和输出1.定制输入/输出1.1 示例&#xff1a;点坐标输入/输出1.2 流操作符1.3&#xff08;一部分&#xff09;标准库流类型 2. 工具2.1 用getline读取行 2.2 用ignore进行跳转2.3 格式化操作…