算法51:动态规划专练(力扣139题,单词拆分)---从左往右尝试模型的误区

本文主要是介绍算法51:动态规划专练(力扣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

这一题容易让人产生误导,一个target字符串,一个list数组,看起来非常像从左往右的尝试模型。一开始,我也是这么尝试的,按照从左往右尝试模型进行写递归版本代码的,写着写着发现不对劲。list数组中的单词可以重复使用,但是每个单词是固定的,不允许再拆分成逐个字母的。这一点和我之前写的贴纸拼词  算法34:贴纸拼词(力扣691题)-CSDN博客不一样

以下方为例:

输入: s = "catsandog", wordDict = ["cats", "dog", "san",  "cat"]  输出: true

如果以cat开头,那么第二个单词为 sand,第三个单词为dog,可以拼出来

如果以cats开头,那第二个单词就为and,第三个单词就为og了 拼不出来。

因此,需要对s进行讨论和判断了。

字符catsandog
下标012345678

1. 如果以c、ca为单词,list里面找不到

2.如果以cat为单词,list里面能够找到;这就是1中情况;那么下标为3的s就可能是第二个单词的开头

3.如果以cats为单词,list里面也能够找到,那么下标为4的a就可能是第二个单词的开头;

4. 如果第二个单词是以s开头的,san为单词,可以在list找到;此时,下标为6的d可能是下一个单词的开头了;

5.如果第二个单词是以a开头的,在list里面找不到;

6. 第三个单词,则是以d开头,dog在list里面可以找到;因此,可以拼出最终的s字符串;

代码如何实现呢?

package code04.动态规划专项训练03;import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;/*** 力扣 139题 : 单词拆分* https://leetcode.cn/problems/word-break/description/?envType=study-plan-v2&envId=dynamic-programming** 思路:* 1. 统计list中存在的无重复单词* 2. 字符串从0处开始往后找*     a. 如果字符串中能否切割出一个完整的单词,这个单词是在list表中出现的。那么就把这个单词末尾字符的下一个下标标记为新单词的开始位置,即dp表对应下标标记为true*     b. 如果找到末尾都找不到,就一直找。直到本轮递归结束* 3. 找到 dp 表中 对应为 true的下标。 从此下标开始可以组成一个新单词。具体逻辑与步骤2相同.*    举例说明:*    s = "catsandog"*    wordDict = ["cats", "dog", "sand", "and", "cat"]**    字符串     c a t s a n d d o g*    dp表下标   0 1 2 3 4 5 6 7 8 9*    dp表下标   T F F T T F F T F F*    下标0处 为 true 一个字符串如果开头位置*    下标3处 为 true 因为cat在字典中能够找到,所以下标3可能是一个新单词的开头*    下标4处 为 true 因为cats在字典中能够找到,所以下标4可能是一个新单词的开头*    下标7处 为 true 无论是sand 还是 and 都是单词。因此他们末尾的下一个下标,即index=7可能是一个新单词的开头** 4. 如果整个字符串都可以由字典list中单词拼接出来。那么这个字符串一定可以走到末尾。而dp表的长度是比字符串的长多多1. 即dp*    表的末尾肯定为true。*/
public class WordBreak_官方题解_02 {public boolean wordBreak(String s, List<String> wordDict){//统计list中无重复单词Set<String> wordDictSet = new HashSet(wordDict);//记录哪些位置可以是单词的开始位置boolean[] dp = new boolean[s.length() + 1];//默认从下标为0处为单词的开始位置dp[0] = true;for (int i = 1; i <= s.length(); i++) {for (int j = 0; j < i; j++) {//dp[j] = true, 代表j这个位置是一个单词的开头if (dp[j] && wordDictSet.contains(s.substring(j, i))) {//i代表本来循环的末尾位置。因此 String.substring(j, i) 是 [j,i)//i的前一个位置为单词的末尾位置。那么i就是新单词的开始位置或者空的占位dp[i] = true;break;}}}return dp[s.length()];}public static void main(String[] args) {WordBreak_官方题解_02 s = new WordBreak_官方题解_02();String a = "leetcode";List<String> list2 = new ArrayList<>();list2.add("leet");list2.add("code");System.out.println(s.wordBreak(a, list2));/* List<String> list = new ArrayList<>();list.add("cats");list.add("dog");list.add("sand");list.add("and");list.add("cat");String s1 = "catsandog";System.out.println(s.wordBreak(s1, list));*/}
}

这一题倒不难,只是由于我之前习惯性的按照动态规划的固定模板化思路去解题,容易进入误区;

老是想着套路、模型去解题,有时候确实事半功倍;但是,这一题却反其道而行,让你看着像是之前的解题套路,结果就迷茫了。

下一题,我将分享另一个看着像从左往右模型套路的题。但是,由于数据量比较大,肯定要排除掉从左往右模型的题目。

这篇关于算法51:动态规划专练(力扣139题,单词拆分)---从左往右尝试模型的误区的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/833124

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

如何在本地部署 DeepSeek Janus Pro 文生图大模型

《如何在本地部署DeepSeekJanusPro文生图大模型》DeepSeekJanusPro模型在本地成功部署,支持图片理解和文生图功能,通过Gradio界面进行交互,展示了其强大的多模态处... 目录什么是 Janus Pro1. 安装 conda2. 创建 python 虚拟环境3. 克隆 janus

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee

Java导出Excel动态表头的示例详解

《Java导出Excel动态表头的示例详解》这篇文章主要为大家详细介绍了Java导出Excel动态表头的相关知识,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录前言一、效果展示二、代码实现1.固定头实体类2.动态头实现3.导出动态头前言本文只记录大致思路以及做法,代码不进

DeepSeek模型本地部署的详细教程

《DeepSeek模型本地部署的详细教程》DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私,在本地成功部署DeepSe... 目录一、环境准备(一)硬件需求(二)软件依赖二、安装Ollama三、下载并部署DeepSeek模型选

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要