【动态规划】Leetcode 139. 单词拆分【中等】

server/2024/11/13 10:04:06/

单词拆分

  • 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。

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

示例 1:

输入: s = “leetcode”, wordDict = [“leet”, “code”]
输出: true
解释: 返回 true 因为 “leetcode” 可以由 “leet” 和 “code” 拼接成。

解题思路

这个问题可以使用动态规划来解决。

  • 1、我们定义一个长度为 s.length()+1 的布尔数组 dp,其中 dp[i] 表示字符串 s 的前 i 个字符是否可以被字典中的单词拼接而成。
    动态规划的状态转移方程为:

  •  dp[i] = dp[j] && wordDict.contains(s.substring(j, i)),其中 0 <= j < i
    

    这个方程的意思是,如果存在一个 j,使得 dp[j] 为 true并且字典中包含 s.substring(j, i), 那么 dp[i] 就可以被设置为 true,表示字符串 s 的前 i 个字符可以被拼接而成。

  • 2、初始化数组dp,长度为s.length() + 1,全部初始化为false。

  • 3、设置dp[0]为true,表示空字符串可以被拆分。

  • 4、使用两层循环遍历字符串s的每个字符,外层循环遍历从1到s.length(),内层循环遍历从0到i,判断从0到j的子串是否可以被拆分,并且判断从j到i的子串是否在wordDict中,如果满足条件,则将dp[i]设置为true。

  • 5、最终返回dp[s.length()]即可。

Java实现

public class WordBreak {public boolean wordBreak(String s, List<String> wordDict) {Set<String> wordSet = new HashSet<>(wordDict);int n = s.length();boolean[] dp = new boolean[n + 1];dp[0] = true;for (int i = 1; i <= n; i++) {for (int j = 0; j < i; j++) {if (dp[j] && wordSet.contains(s.substring(j, i))) {dp[i] = true;break;}}}return dp[n];}public static void main(String[] args) {WordBreak wb = new WordBreak();String s = "leetcode";List<String> wordDict = Collections.unmodifiableList(Arrays.asList("leet", "code"));System.out.println("Can be broken: " + wb.wordBreak(s, wordDict));// Output: true ("leetcode" can be broken into "leet" and "code")}
}

时间空间复杂度

  • 时间复杂度:外层循环遍历了s.length()次,内层循环遍历了字符串s的每个字符,时间复杂度为O(n^2),其中n为字符串s的长度。

  • 空间复杂度:使用了长度为s.length() + 1的数组dp和一个哈希集合wordSet,空间复杂度为O(n)。


http://www.ppmy.cn/server/16781.html

相关文章

Android ViewModel使用模板

1&#xff0c;创建ViewModel类 //MainViewModel.kt import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.example.myapplication.entity.Banner import com.example.myapplication.network.BaseRes…

JVM垃圾收集器--分代收集器

垃圾收集器主要分为两大类&#xff1a;分区收集器和分代收集器。分代收集器的代表是CMS&#xff0c;分区收集器的代表是G1和和ZGC。 分代收集器 CMS CMS收集器是第一个关注GC停顿时间&#xff08;stw时间)的收集器&#xff0c;采用“标记-清除”算法&#xff0c;之前的垃圾收…

Java集合框架-Collection-List-vector(遗留类)

目录 一、vector层次结构图二、概述三、底层数据结构四、常用方法五、和ArrayList的对比 一、vector层次结构图 二、概述 Vector类是单列集合List接口的一个实现类。与ArrayList类似&#xff0c;Vector也实现了一个可以动态修改的数组&#xff0c;两者最本质的区别在于——Vec…

主从模式与AI大模型结合:开启AI新时代

什么是主从模式&#xff1f; 主从模式&#xff08;Master-Slave Pattern&#xff09;是一种在分布式系统中常用的架构设计模式。在主从模式中&#xff0c;系统被分解为两种角色&#xff1a;主节点&#xff08;Master&#xff09;和从节点&#xff08;Slave&#xff09;。主节点…

python_django农产品物流信息服务系统6m344

Python 中存在众多的 Web 开发框架&#xff1a;Flask、Django、Tornado、Webpy、Web2py、Bottle、Pyramid、Zope2 等。近几年较为流行的&#xff0c;大概也就是 Flask 和 Django 了 Flask 是一个轻量级的 Web 框架&#xff0c;使用 Python 语言编写&#xff0c;较其他同类型框…

上海国际会展深入未来智能相机的发展趋势

#智能相机# 近日&#xff0c;在上海国际会展中心举办了一场引人注目的盛会——上海国际橡塑展。本次展览本公司旨在展示智能相机的最新技术与应用&#xff0c;吸引国内外的企业、专家和学者齐聚一堂&#xff0c;共同探讨和展望国内智能相机行业的未来发展。本次展览德成视觉科技…

matlab保存示波器数据

再重新运行一下示波器 然后就可以在工作区看见&#xff08;这里没有运行所以没有&#xff09; 将保存到文件夹中方便后续绘图

linux下使用qt+mpv调用GPU硬件解码

linux下GPU硬件解码接口&#xff0c;常用的有vdpau和vaapi。 mpv是基于mplayer开发的一个播放器。此外&#xff0c;mpv还提供了函数库libmpv&#xff0c;通过使用libmpv可以编写一个简单的播放器。 基于qtlibmpv的demo&#xff0c;官方例子代码如下&#xff1a;https://github.…