139-单词拆分

动态规划四 ①139. 单词拆分 难度中等1061 给定一个非空字符串s和一个包含非空单词的列表wordDict,判定s是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 2: 输入: s = "applepenapple", wordDict = ["apple", "pen"] 输出: true 解释: 返回 true 因为 示例 3: 输入: s = "catsandog", wordDict = ... 阅读详情

题目

给你一个字符串 s 和一个字符串列表 wordDict 作为字典,判定 s 是否可以由空格拆分为一个或多个在字典中出现的单词。

说明:拆分时可以重复使用字典中的单词。

示例 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

题解一 DFS+记忆化

var wordBreak = function(s, wordDict) {
    const len = s.length;
    const wordSet = new Set(wordDict);
    const memo = new Array(len);

    const canBreak = start => {
        if(start === len) return true;//划分到最后一个了,不用再分了
        if(memo[start] !== undefined) return memo[start];

        for(let i = start+1;i <=len;i++){
            let sub = s.slice(start,i);
            if(wordSet.has(sub)&&canBreak(i)){
                memo[start]=true;//缓存当前递归的结果 
                return true;
            }
        }
        memo[start]=false;
        return false;//后面的都不行了才为false
    }
    return canBreak(0);
};

笔记:

  1. 用 DFS 回溯,考察所有的拆分可能,指针从左往右扫描:
    如果指针的左侧部分是单词,则对剩余子串递归考察。
    如果指针的左侧部分不是单词,不用看了,回溯,考察别的分支。

  2. memo[i]的意思是字符串s在i之后的子串可以break

  3. array.slice(start,end)前开后闭

  4. js 中 Set 常用方法总结

    1、创建 Set

    1.1、new Set()方式创建

    let v = new Set()
    1.2、通过传入数组方式创建

    let v = new Set([1,2,3,3,5])

    2、添加元素

    使用 add 方法

    let v = new Set()
    v.add(1)

    3、删除元素

    使用 delete 方法

    let v = new Set()
    v.add(1)
    v.add(5)
    v.delete(5)

    4、获取 Set 中元素个数

    使用 size

    let v = new Set()
    v.add(1)
    v.add(5)
    v.size

    5、判断 Set 中是否包含某个元素

    使用 has 方法

    let v = new Set()
    v.add(1)
    v.add(5)
    v.has(5)

    6、遍历 Set

    6.1、forEach形式

    let v = new Set()
    v.add(1)
    v.add(5)

    v.forEach(t=>{
    console.log(t)
    })
    6.2、for of 形式

    let v = new Set([1,2,3,3,5])

    for(let t of v) {
    console.log(t)
    }

    7、Set 转换成数组

    使用 Array.from 方法

    let v = new Set([1,2,3,3,5])
    let a = Array.from(v)

题解二 BFS

const wordBreak = (s, wordDict) => {
  const wordSet = new Set(wordDict);
  const len = s.length;
  const visited = new Array(len);

  const queue = [];
  queue.push(0);

  while (queue.length) {
    const start = queue.shift();  // 考察出列的指针 存的是数组的index
    if (visited[start]) continue; // 是访问过的,跳过
    visited[start] = true;        // 未访问过的,记录一下

    for (let i = start + 1; i <= len; i++) { // 用指针i去划分两部分
      const prefix = s.slice(start, i);      // 前缀部分
      if (wordSet.has(prefix)) {  // 前缀部分是单词
        if (i < len) {            // i还没越界,还能继续划分,让它入列,作为下一层待考察的节点
          queue.push(i);
        } else {  // i==len,指针越界,说明s串一路被切出单词,现在没有剩余子串,不用划分,返回true
          return true;
        }
      } // 前缀部分不是单词,i指针不入列,继续下轮迭代,切出下一个前缀部分,再试
    }
  }
  return false; // BFS完所有节点(考察了所有划分的可能)都没返回true,则返回false
};

笔记:

  1. 栈 push入 pop出
  2. 队列(queue)shift移除第一项并返回 unshift在前端添加任意项并返回新数组的长度
  3. bfs利用队列 父先进,然后父出,所有的子进(考察子节点,能入列的就入)。
  4. bfs要单独创建队列 dfs用栈

题解三 动态规划

var wordBreak = function (s, wordDict) {
  const wordSet = new Set(wordDict);
  const len = s.length;
  const dp = new Array(len + 1).fill(false);
  dp[0] = true;
  for (let i = 1; i <= len; i++) {
    for (let j = i - 1; j >= 0; j--) {// j去划分成两部分
      if (dp[i] == true) break;
      if (dp[j] == false) continue;
      const suffix = s.slice(j, i); // 后缀部分 s[j: i-1]
      if (wordSet.has(suffix) && dp[j] == true) { // 后缀部分是单词,且左侧子串[0,j-1]的dp[j]为真
        dp[i] = true;
        break;// dp[i] = true了,i长度的子串已经可以拆成单词了,不需要j继续划分子串了
      }
    }
  }
  return dp[s.length];
};

笔记:

    • s 串能否分解为单词表的单词(前 s.length 个字符的 s 串能否分解为单词表单词)

    • 将大问题分解为规模小一点的子问题:

      • 前 i个字符的子串,能否分解成单词

      • 剩余子串,是否为单个单词。

      dp[i]:长度为i的s[0:i-1]子串是否能拆分成单词。题目求:dp[s.length]

  1. 状态转移方程

    • 类似的,我们用指针 j 去划分s[0:i] 子串,如下图:
    • s[0:i] 子串对应 dp[i+1] ,它是否为 true(s[0:i]能否 break),取决于两点:
      • 它的前缀子串 s[0:j-1] 的 dp[j],是否为 true。
      • 剩余子串 s[j:i],是否是单词表的单词。
  2. 动态规划 优化 代码
    迭代过程中,如果发现dp[i] == true ,直接break
    如果dp[j] == false,dp[i]没有为 true 的可能,continue,考察下一个 j

  3. 拆分时可以重复使用字典中的单词,说明就是一个完全背包.

  4. 01背包的核⼼代码
    01背包内嵌的循环是从⼤到⼩遍历,为了保证每个物品仅被添加⼀次。

  5. 完全背包核心代码
    完全背包的物品是可以添加多次的,所以要从⼩到⼤去遍历

vmware vsphere 证书过期告警处理方法 vSphere Clinet 管理页面出现“证书告警” ,检查证书未发现现有证书有过期现象 阅读详情

相关推荐

深入解析DisplayPort(DP)接口:从主链路到辅助通道的全方位技术剖析

本文深入解析DisplayPort(DP)接口的核心技术架构,重点剖析了其三大功能模块:承载视频/音频数据洪流的Main-Link主链路、负责链路训练与设备控制的AUX CH辅助通道,以及实现智能交互的HPD热插拔检测。文章详细阐述了主链路的可伸缩Lane配置、嵌入式时钟与数据成帧机制,以及辅助通道在设备发现、动态优化信号质量(链路训练)中的关键作用,揭示了DP接口实现高效率与灵活性的设计哲学。

weixin_29267307的博客 492

Leetcode:给定一个字符串s和一个单词字典dict,确定是否可以将s分割成一个由一个或多个字典单词组成的空格分隔的序列。

Given a stringsand a dictionary of wordsdict, determine ifscan be segmented into a space-separated sequence of one or more dictionary words. For example, givens="leetcode",dict=["leet", "code"...

LeetCode:Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum 2426

Ego-Planner实战避坑指南:从环境搭建到仿真运行

本文详细介绍了在Windows系统下,通过WSL2搭建Ego-Planner无人机路径规划算法开发环境的完整流程与实战避坑指南。内容涵盖ROS Noetic安装、第三方依赖库(如Ceres Solver)编译冲突解决、Realsense SDK版本降级处理,以及Gazebo仿真与真机调试的常见问题,旨在帮助开发者高效完成环境配置并成功运行仿真。

weixin_29232507的博客 700

【leetcode-字符串】单词拆分

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

kangbin825的专栏 878

SAP MM采购合同创建全解析:ME31K操作与后台逻辑

在SAP ERP的物料管理模块中,采购合同作为框架协议的核心,定义了企业与供应商之间的长期供货关系。它与采购订单不同,合同不直接产生收货或发票,而是为后续采购订单提供数据源。创建合同(事务码ME31K)时,需要区分数量合同与金额合同,并维护抬头、行项目、有效期、价格条件和税码等关键信息。SAP通过源确定机制在创建采购订单时自动匹配合同,同时审批策略、编码范围和输出类型也会影响合同的实际可用性。掌握合同创建逻辑,能有效解决采购订单无法带出合同、审批未触发、价格缺失等高频问题。从ME31K实操出发,系统梳理采购

weixin_30000735的博客 199

科研作图不发愁:手把手教你用PyMOL给蛋白-DNA互作图‘美颜’(附完整配色与标注方案)

本文详细介绍了如何使用PyMOL对蛋白-DNA互作结构图进行专业美化,包括从PDB文件加载、结构展示与标注、互作位点突出显示到高质量渲染输出的完整流程。通过具体案例(PDB ID:8SSS)演示了锌指结构域区分、关键残基标注和互作距离测量等实用技巧,帮助科研人员制作可直接用于期刊投稿的高质量示意图。

weixin_42523792的博客 554

[LeetCode]139. 单词拆分

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

zaker123的博客 194

STM32内存大小与地址的对应关系以及计算方法

1、概述 在计算机中要访问存储区,都是通过地址来进行访问的,包括所有的外设(比如串口、内存、硬盘等),都对应有一个访问地址,地址就相当于门牌号,有了门牌号,我们才知道操作的是哪一个区域、哪一个外设。 最被大家熟知的是计算机内存,计算机内存有4G、8G,16G等等,对于程序员而言,要在代码中操作这些内存,肯定得知道内存的地址,此外,还需要会计算地址与内存大小的计算方法与对应关系。STM32作为微

Ace's Blog 4万+

139. 单词拆分

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

MIC10086的博客 296

FCTA/FCTB 前方交通穿行预警/制动系统技术规范

FCTA&FCTB前方交叉路口预警制动系统是针对十字路口和停车场等"鬼探头"场景设计的驾驶辅助系统。系统在自车速度0-40km/h范围内工作,通过角雷达和摄像头检测侧向来车.

未知艺术家的博客 745

手把手教你学Simulink——基于Simulink的蚁群算法路径规划仿真建模示例

路径规划是机器人导航系统中的核心任务之一,旨在为机器人找到一条安全且高效的路径,使其能够从起点到达目标点,同时避免与障碍物发生碰撞。在开始之前,需要定义工作环境(例如地图),包括起点、终点以及可能存在的障碍物位置。通过本指南,我们介绍了如何基于Simulink结合MATLAB实现蚁群算法的路径规划仿真建模。

MHD0815的博客 223

LeetCode 139 —— 139.单词拆分

LeetCode 139 单词拆分,简单的动态规划题目。

刘伟佳的博客 1180

ICM20948 DMP代码详解(69)

ICM20948 DMP代码详解(69)

phmatthaus的专栏 618

Leetcode 139. 单词拆分

Leetcode 139. 单词拆分1、问题分析2、问题解决3、总结 1、问题分析 题目链接:https://leetcode-cn.com/problems/word-break/   本质上就是一个深搜问题。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。 2、问题解决   笔者以C++方式解决。 #include "iostream" using namespace std; #include "algorithm" #in

珍惜 8941

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

leetcode139. 单词拆分,动态规划

leetcode139. 单词拆分,动态规划

热爱C++和golang的学生 2102

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

139.单词拆分

能否拆分成字典中的单词,可通过先判断其子串是否能拆分成字典中的单词来逐步推导,存在大量重复的子问题判断过程,所以适合用动态规划求解。此问题具有明显的动态规划特征。动态规划适用于存在重叠子问题和最优子结构性质的问题。在本题里,要判断字符串。:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。请你判断是否可以利用字典中出现的单词拼接出。

qq_40844444的博客 705

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

leetcode139 单词拆分

leetcode139 单词拆分 题目详情 题目解析 递归(有记忆递归) 根据题目可以试想,如果确定字符串前 i 个字符能是wordDict中的单词,那么只要半段第 i 个 字符以后的字符串是否能够拆分即可。因此可以采用递归的方式进行穷举。 为了能够更快的查找到wordDict是否包含字符串,可以将wordDict 转换成HashSet。 直接进行递归的时间复杂度为 O(n^n) 递归过程中会产...

suyongcai1234的博客 219

leetcode 139. 单词拆分

leetcode 139. 单词拆分 题目详情 题目链接 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1: 输入: s = “leetcode”, wordDict = [“leet”, “code”] 输出: true 解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。 示例 2: 输

qq_33789406的博客 288

LeetCode139. 单词拆分

LeetCode139.单词拆分

Love Peace 657

LeetCode139-单词拆分

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

qq_40788718的博客 283

LeetCode 139. 单词拆分 | Python

使用动态规划的思路,解决《139. 单词拆分》问题

"大梦三千秋的博客 1010

用python写leetcode【2】 --单词拆分(139)、单词拆分2(140)

文章目录分割回文串(131)题目思路代码单词拆分(139)题目思路代码 分割回文串(131) 题目 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。 返回 s 所有可能的分割方案。 示例: 输入: “aab” 输出: [ [“aa”,“b”], [“a”,“a”,“b”] ] 思路 代码 class Solution: def partition(self,...

rory0114的博客 1509

Leetcode 139. 单词拆分 C++

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

weixin_43750513的博客 420

【LeetCode139】单词拆分

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。示例 1:输入: s = “leetcode”, wordDict = [“leet”, “code”]输出: true解释: 返回 true 因为 “leetcode” 可以由 “leet” 和 “code” 拼接成。

小亭宇的博客 421

力扣——139. 单词拆分,140. 单词拆分 II

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

qq_37552636的博客 320
上一篇: 206-反转链表
下一篇: 141-环形链表
codrab
博客等级 码龄10年 15粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codrab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值