140. 单词拆分 II(回溯法)

“单词拆分 II”:动态规划+路径回溯,才是刷题人的解法王道! 本文介绍了如何高效解决LeetCode 140题"单词拆分II"。作者首先指出纯回溯解法会导致重复计算和超时问题,进而提出结合动态规划与回溯的优化方案。具体解法分为三步:1)用动态规划标记字符串的可拆分位置;2)基于可达性结果进行记忆化回溯搜索;3)拼接所有有效拆分路径。文章通过"走迷宫"的比喻形象解释算法原理,并以"catsanddog"为例演示执行过程,最后强调记忆化剪枝的关键作用。该解法体现了算法设计中规划先行、优化路径的核心思想,适用于类似 阅读详情
/**
 * 140. 单词拆分 II
 * @author wsq
 * @date 2020/11/1
	 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。
	说明:
	分隔时可以重复使用字典中的单词。
	你可以假设字典中没有重复的单词。

	示例 1:
	输入:
	s = "catsanddog"
	wordDict = ["cat", "cats", "and", "sand", "dog"]
	输出:
	[
	  "cats and dog",
	  "cat sand dog"
	]

	示例 2:
	输入:
	s = "pineapplepenapple"
	wordDict = ["apple", "pen", "applepen", "pine", "pineapple"]
	输出:
	[
	  "pine apple pen apple",
	  "pineapple pen apple",
	  "pine applepen apple"
	]
	解释: 注意你可以重复使用字典中的单词。
	
	链接:https://leetcode-cn.com/problems/word-break-ii
 */
package com.wsq.huishuo;

import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class WordBreak {
	/**
	 *	回溯法,没想到,被困难的标识吓到了。。。
	 * @param s
	 * @param wordDict
	 * @return
	 */
	public List<String> wordBreak(String s, List<String> wordDict) {
        List<String> ans = new LinkedList();
        Map<Integer, List<List<String>>> map = new HashMap();
        List<List<String>> breakList = backTrack(s, s.length(), new HashSet<String>(wordDict), 0, map);
        for(List<String> list: breakList){
            ans.add(String.join(" ", list));
        }
        return ans;
    }
	/**
	 *	采用回溯的方法分割字符串
	 * @param s
	 * @param length
	 * @param wordSet
	 * @param index
	 * @param map 用于报保存用 已访问起始点 分割的字符串的情况, 使用空间换取时间
	 * @return
	 */
    private List<List<String>> backTrack(String s, int length, Set<String> wordSet, int index, Map<Integer, List<List<String>>> map){
        if(!map.containsKey(index)){
            List<List<String>> wordBreaks = new LinkedList();
            if(index == length){
                wordBreaks.add(new LinkedList());
            }
            for(int i = index + 1; i <= length; i++){
                String word = s.substring(index, i);
                if(wordSet.contains(word)){
                    List<List<String>> subBeaks = backTrack(s, length, wordSet, i, map);
                    for(List<String> list: subBeaks){
                        LinkedList<String> wordBreak = new LinkedList<String>(list);
                        wordBreak.offerFirst(word);
                        wordBreaks.add(wordBreak);
                    }
                }
            }
            map.put(index, wordBreaks);
        }
        return map.get(index);
    }
}

FileZilla Server 1.2.0 TLS证书过期问题 FileZilla Server TLS证书过期后重新生成 阅读详情

相关推荐

STM32F4XX软件模拟I2C实现MPU6050姿态数据采集

本文详细介绍了在STM32F4XX平台上通过软件模拟I2C驱动MPU6050传感器实现姿态数据采集的完整方案。内容涵盖软件I2C的GPIO配置、核心通信函数实现、MPU6050寄存器配置详解以及数据读取处理流程,为硬件资源受限的嵌入式应用提供了灵活的解决方案,并分享了调试技巧与常见问题处理方法。

butter的博客 678

单词拆分

解法 memo存放的是s中已经匹配的部分的首位坐标,例如s = “leetcode”, wordDict = [“leet”, “code”]则memo=[0,4,8] class Solution(object): def wordBreak(self, s, wordDict): """ :type s: str :type wordD...

liunianhuakai的博客 436

用LightRAG+Ollama搭建本地知识库:从文档上传到智能问答的完整流程

本文详细介绍了如何利用LightRAG与Ollama构建企业级本地知识库,涵盖从文档预处理到智能问答的完整流程。通过实战案例展示,该方案能高效处理海量文档,实现语义搜索与知识图谱关联分析,显著提升信息检索效率。特别适合金融、医疗等领域的技术团队快速搭建智能知识管理系统。

weixin_42535461的博客 215

【重温经典】单词拆分 II

方法1:切片函数+记忆化搜索 不带记忆化TLE Map<String, List<String>> cache = new HashMap<>(); List<String> wordDict; public List<String> wordBreak(String s, List<String> wordDict) { this.wordDi.

wat1r的博客 355

【Azure 架构师学习笔记】- Azure Databricks (1) - 环境搭建

Databricks 已经成为了数据科学的必备工具,今时今日你已经很难抛开它来谈大数据,它常用于做复杂的ETL中的T, 数据分析,数据挖掘等,特别适用于做数据建模,机器学习等。那么顺应时代,现在也来看看这个工具的内容。首先要有一个环境,基于Azure 的Databricks简称ADB。托管在Azure 上的Databricks已经被Azure进行了很大的优化, 在搭建时只需要简单的几步即可拥有一个环境,不过要提醒一句ADB的集群并不便宜,用完马上删掉或停止, 否则一晚过百美金就会烧掉。

MVP黄钊吉(發糞塗牆) 2299

昇腾AI处理器Ascend C编程:从C/C++基础到高性能算子开发实战

异构计算是提升AI算力效率的核心技术,通过在CPU之外引入专用处理器(如GPU、NPU)协同工作,实现大规模并行计算。其原理在于将计算密集型任务卸载到专用硬件,利用其高并行架构加速处理。技术价值在于突破传统CPU的算力瓶颈,为深度学习训练与推理提供强大动力,广泛应用于模型部署、科学计算和高性能计算场景。本文聚焦昇腾AI处理器的原生编程语言Ascend C,它基于C/C++标准扩展,通过显式内存管理和任务并行模型,充分发挥达芬奇架构中Cube与Vector单元的性能。针对CANN算子开发,文章详解了从环境搭建

weixin_34411563的博客 368

算法——单词拆分 II

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。 链接: leetcode. 解题思路: 首先用暴力的深度优先搜索进行解体,然后发现对部分测试用例会超时,所以需要对搜索进行剪枝。一般的剪枝手段都是记忆化一种状态的结果,然后当下次搜索到这一状态时防止重复计算,这样基本能将时间复杂度降到O(N)。 深度优先搜索基本使用这一模板,传入一个temp结果,每次递归到底部之前,给temp增加值,然后记.

Think Different. 521

Python解答蓝桥杯省赛真题之从入门到真题

搜了很多历年蓝桥杯真题解答,大多都是Java,C++,C这些语言编写的代码解析。Python解析的几乎,甚至可以说没有。而当下Python又这么火热,蓝桥杯也出了Python组,所以打算写一个Python解答蓝桥杯真题的博客,供大家参考,也在这过程中和大家一起交流。

李波的blog,一名喜欢编程和分享技术的研究僧~ 10万+

leetcode.140. 单词拆分 II

文章目录单词拆分代码与思路单词拆分 II代码与思路 单词拆分 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1: 输入: s = "leetcode", wordDict = ["leet", "code"] 输出: true 解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。 示例 2: 输入:

mirana的专栏 389

微信公众号 - 解决报错 “err_msg“:“system:access_denied“,微信环境浏览器真机使用微信支付、微信授权登录、分享朋友圈转发好友报错system:access_denied

微信公众号,微信网页,手机h5网页,微信报错,system:access_denied,微信支付,提示报错,微信登录授权报错,微信朋友圈分享,微信转发,WeixinJSBridge,微信环境下,微信内置浏览器,微信公众号项目报错system:access_denied,如何解决,invoke(),API调用后出现报错,微信内部H5 WeixinJSBridge.invoke system:access_denied,使用微信jssdk时报access_denied错误,还是报错,真机运行,真机调试api返回

🏆 前端领域优质创作者 1万+

开篇词:学习系统分析师的好处?核心考点有哪些?

系统分析师备考指南 系统分析师是IT行业的高级专业人才,具备系统分析与设计能力,能指导开发团队工作。学习系统分析师不仅能获得职业晋升的"黄金跳板",还能全面提升技术架构思维和业务理解能力。 核心价值: 职业发展:晋升管理岗位的硬性要求,突破职业天花板 能力提升:构建T型知识结构,培养架构思维和软技能 市场竞争力:成为"业务+技术"桥梁,获得国家级专业认证 考试内容: 计算机基础知识(硬件、操作系统、网络等) 系统分析专业知识(软件工程、架构设计等) 进阶知识(企业信息

数据知道的博客 5947

【LeetCode】升级打怪之路 Day 27:回溯算法 — 单词拆分问题

Day 27:回溯算法 —— 单词拆分问题

VLyb 453

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

leetcode-140. 单词拆分 II (字典树/dp + 回溯法) + 字节测开字典树算法题

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。 说明: 分隔时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1: 输入: s = "catsanddog" wordDict = ["cat", "cats", "and", "sand", "dog"] 输出: [ "cats and dog", "cat sand dog" ] 示例 2: 输入: s =...

sxtopc的博客 709

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

LeetCode 140. 单词拆分 II (DP+回溯法+字典树)

140. 单词拆分 II 一种极端情况—— 字典里的单词不能拼成目标单词,这个时候无需判断,这个时候直接使用 单词拆分的代码判断一下就好。 然后使用回溯法去拆分单词就好 时间复杂度:(2∣s∣)(2^{|s|})(2∣s∣) (在最坏情况下,每个位置都有两个选择。) class Trie{ struct Node{ bool end = false; Node* children[26] = {0}; }; Node* root = new Nod

SongyangJi 464

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

力扣140. 单词拆分 II

第九十八天 --- 力扣140. 单词拆分 II题目一思路一:不含“记忆化”优化的回溯细节:二:“记忆化”优化回溯为什么要优化?过程细节代码 题目一 力扣:140. 单词拆分 II 思路 1、这很明显,是一种维护出所有符合要求的路径的问题,这种问题在大方向上一定要明确,首选就是——————>“回溯法” 2、我们分两种方法介绍,第二种是优化版本,建议使用第二种方法。 一:不含“记忆化”优化的回溯 1、这个算法的核心思想就是,自己干自己的,每个分支我都单独给你一个维护的串,等维护到最后符合要求者直接

qq_45678698的博客 664

leetcode 140. 单词拆分 II(回溯法 +前缀树)

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。 说明: 分隔时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1: 输入: s = "catsanddog" wordDict = ["cat", "cats", "and", "sand", "dog"]...

sinat_30281495的博客 576

lc 140.hard单词拆分II【①动态规划->lc139.单词拆分;②*****枚举 - 回溯法】

官方题解https://leetcode-cn.com/problems/word-break-ii/solution/dan-ci-chai-fen-ii-by-leetcode-solution/ 抄答案: class Solution { public: unordered_set<string> wordDictSet; unordered_map<int, vector<string>> sen; //记录每个下标对应的字符 以它开头..

sankuaizhuobu的博客 240

140.单词拆分 II

所有可能的单词拆分方式,就需要不断尝试不同的拆分点。而记忆化搜索则用于避免重复计算,因为在拆分过程中会有很多子问题会被重复求解。此问题可通过回溯法结合记忆化搜索来解决。回溯法适用于需要找出所有可能组合的问题,在本题中,要找出字符串。,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。和一个包含非空单词列表的字典。

qq_40844444的博客 579

力扣labuladong一刷day63天单词拆分

思路:s是否能被拆分成字典中的单词,单词数量是不限的,故是完全背包问题,不限数量的单词是否能组成字符串s,可以看的出来,并不是要求你长度相等就可以,还得有一定的顺序才能排列成字符串s,故本题还是一个排列问题。另外采用回溯的方法也可以做,不过要把遍历改为子问题,下面这个就是改造成分解子问题,当前片段存在字典中,只要后续的都可以拼接说明字符串s可以被拼接。定义dp[i]表示,s[0, i]可以被字典元素拼出来,那么如果s[j, i]是字典元素,且dp[j]是true,就说明dp[i]可以被拼出。

qq_43511039的博客 624

高频算法面试题(字符串) leetcode 140. 单词拆分 II

leetcode 140. 单词拆分 II 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。 说明: 分隔时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1: 输入: s = "catsanddog" wordDict = ["cat", "cats", "and...

weixin_33825683的博客 244

[回溯+剪枝]leetcode140:单词拆分 Ⅱ(hard)

题目: 140. 单词拆分 II 题解: 回溯+剪枝 若使用回溯法一般框架,对于aaa...aaa这种字符串时,会造成大量重复计算从而导致超时现象,所以我们需要加个map存放<s,result>,这样达到剪枝的效果,优化时间。 代码如下: class Solution { public: vector<string> wordBreak(string s...

algsup 569

00回溯困难 LeetCode140. 单词拆分 II NC182 单词拆分(二)

140. 单词拆分 II 描述 给定一个字符串 s 和一个字符串字典 wordDict ,在字符串 s 中增加空格来构建一个句子,使得句子中所有的单词都在词典中。以任意顺序 返回所有这些可能的句子。 注意:词典中的同一个单词可能在分段中被重复使用多次。 分析 回溯思想 从头开始向后遍历,截取字符串,判断字符串是否在字典集合中出现,存在则向下递归(下层的起始是从上层的单词后面的那个字符开始的),若不存在跳过,继续向后遍历,直到遍历结束。 递归结束条件:遍历的起点等于字符串s的长度 使用两个全局List,一个

31楼下小黑的博客 7108

2020-11-01

11.1每日一题140. 单词拆分 II 140. 单词拆分 II 这道题是139题的拓展,所以先来解决139,139是判断字符串是否可以拆分成字典中的单词,可以想到使用动态规划的方法来解决这道题,设dp[i]是长度为i的字符串能否拆分成单词,那么将字符串i拆解成(0,j)和(j,i)如果这两个字符串都是在字典中出现的单词,那么组合后的i也是字典中的单词,因此转移方程为:dp[i] = dp[j] && wordDict.contains(s.substring(j, i)),当i = 0,

weixin_42332634的博客 120

LeetCode 单词拆分II(回溯法+剪枝)

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。 说明: 分隔时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1: 输入: s = "catsanddog" wordDict = ["cat", "cats", "and", "sand", "dog"]

hestyle的博客 1166

Leetcode140单词拆分 II

给定一个非空字符串s和一个包含非空单词列表的字典wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。 说明: 分隔时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1: 输入: s = "catsanddog" wordDict = ["cat", "cats", "and", "sand", "dog"]

lMonster81 356
上一篇: 837. 新21点(动态规划)
下一篇: Spring-boot基础配置
Lazy mode
博客等级 码龄10年 13粉丝 311原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值