动态规划篇-06:单词拆分

这篇具有很好参考价值的文章主要介绍了动态规划篇-06:单词拆分。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

139、单词拆分

动态规划篇-06:单词拆分,手把手带你刷力扣Hot100,动态规划,算法

老样子,还是先尝试找出状态转移方程

状态转移方程

对问题进行分解,尝试从子问题入手解决。这也是前文提到过的 “分解问题” 的思想

 对于输入的字符串 s,如果我能够从单词列表 wordDict 中找到一个单词匹配 s 的前缀 s[0..k],那么只要我能拼出 s[k+1..],就一定能拼出整个 s。换句话说,我把规模较大的原问题 wordBreak(s[0..]) 分解成了规模较小的子问题 wordBreak(s[k+1..]),然后通过子问题的解反推出原问题的解。

先找到字符串的一个前缀,如果我能拼出它剩下的部分,那么我就能拼出整个字符串。相当于将“拼出字符串”这个问题分解为“前缀” + “剩下部分”

base case

想要从wordDict中拼出字符串s,将其分为“前缀” 和 “剩下部分” 两部分。先判断 “前缀” 在 wordDict中是否存在,如果存在再判断 “剩下部分” 是否能拼出

考虑边界,当前缀的长度和字符串s的长度相等时,说明该字符串可以被拼出

if( 前缀 == s.length()){
    return true;
}

明确状态

前文已经讲过多次,“状态”就是原问题或者子问题中会变化的变量。

在此题中,状态就是 “当前字符串是否能被拼出”

确定选择

选择就是导致状态变化的行为,在此题中对应的是字符串s的 “前缀”。

定义dp函数

定义dp(string s,int i) 表示:字符串s从i下标开始是否能够拼出

联系框架

动态规划篇-06:单词拆分,手把手带你刷力扣Hot100,动态规划,算法

遍历所有可能的前缀,从而得出所有状态的结果

使用了备忘录的自上而下的递归解法

class Solution {
    HashSet<String> wordDict;
    int[] memo;
    public boolean wordBreak(String s, List<String> wordDict) {
        //将wordDict转为hashset,以便于后面使用contains方法
        this.wordDict = new HashSet<>(wordDict);
        //设置备忘录并初始化
        this.memo = new int[s.length()];
        //-1表示尚未判断,0表示无结果,1表示有结果
        Arrays.fill(memo,-1);
        return dp(s,0);
    }
    boolean dp(String s,int i){
        //base case : 当前缀长度和字符串s长度相等时说明s可以被拼出
        if(i == s.length()){
            return true;
        }
        //如果备忘录中存在该数据,直接取用
        if(memo[i] != -1){
            return memo[i] == 0 ? false : true;
        }
        //遍历选择列表:所有可能的前缀
        for(int len = 1;len + i <= s.length();len++){
            //获得前缀字符串并判断是否存在于wordDict中
            String prefix = s.substring(i,i + len);
            //如果存在,那么问题转变为判断从(i+len)下标开始是否能拼出
            if(wordDict.contains(prefix)){
                boolean subPreblem = dp(s,i + len);
                if(subPreblem ){
                    memo[i] = 1;
                    return true;
                }
            }            
        }
        memo[i] = 0;
        return false;
    }
}
  • wordBreak 函数接受一个字符串 s 和一个单词字典 wordDict 的列表作为输入。它将单词字典转换成 HashSet,以便进行快速查找。同时,它初始化了一个长度为字符串 s 长度的备忘录数组 memo,并将其中所有元素都设为 -1。然后,它调用 dp 函数,并传入字符串 s 和起始索引 0。
  • memo数组元素的含义是 memo[i] :从索引i开始的子串能否被拼出来的结果
  • dp 函数用于判断从索引 i 开始的子串是否可以被拼出来。它首先检查是否达到了字符串末尾,如果是的话,直接返回 true,表示该子串可以被拼出。然后,它检查备忘录数组 memo 中是否已经计算过该索引位置的结果,如果是的话,就直接返回相应的值。如果 memo[i] 的值为 0,表示子串无法被拼出,返回 false;如果 memo[i] 的值为 1,表示子串可以被拼出,返回 true。

如果备忘录数组中没有存储对应索引位置的结果,那么函数进入循环,遍历从索引 i 开始的所有前缀。对于每个前缀,它检查该前缀是否存在于单词字典中。如果存在,就递归调用自身,并更新索引为 i+len,判断剩余部分是否可以被拼出来。如果递归调用的结果为 true,表示剩余部分可以被拼出,那么将 memo[i] 的值设为 1,并返回 true。

如果没有找到匹配的前缀,那么将 memo[i] 的值设为 0,表示子串无法被拼出,返回 false。文章来源地址https://www.toymoban.com/news/detail-813786.html

到了这里,关于动态规划篇-06:单词拆分的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手把手带你搞懂AMS启动原理

    彻底搞懂AMS即ActivityManagerService,看这一篇就够了 最近那么多教学视频(特别是搞车载的)都在讲AMS,可能这也跟要快速启动一个app(甚至是提高安卓系统启动速度有关),毕竟作为安卓系统的核心系统服务之一,AMS以及PMS都是很重要的,而我之前在 应用的开端–PackageManag

    2024年02月12日
    浏览(123)
  • 手把手带你调参Yolo v5(二)

    来源:投稿 作者:王同学 ​​​​​​​编辑:学姐 今天我们继续上次的YOLOv5参数解析,这次主要解析源码中train.py文件中包含的参数。 1.1\\\'--weights\\\' 1.2\\\'--cfg\\\' 1.3\\\'--data\\\' 1.4\\\'--hyp\\\' 1.5\\\'--epochs\\\' 1.6\\\'--batch-size\\\' 1.7\\\'--imgsz\\\', \\\'--img\\\', \\\'--img-size\\\' 1.8\\\'--rect\\\'🍀 1.9\\\'--resume\\\'🍀 1.10\\\'--nosave\\\' 1.11\\\'--nova

    2024年02月05日
    浏览(58)
  • 【手把手带你学JavaSE】String类(下篇)

    上篇我们已经学习了String类的一些知识,接下来我们接着学习! 字符串查找也是字符串中非常常见的操作,String类提供的常用查找的方法。 static String valueof() 数值转字符串 Integer.parseInt() 字符串整形 Double.parseDouble() 字符串转浮点型 String toUpperCase() 转大写 String toLowerCase() 转小

    2024年02月01日
    浏览(138)
  • 手把手带你配置一个DHCP服务器

    最近部门内部成立一个网络兴趣小组,初衷是通过网络知识学习,在遇到网络问题时能够承担起一个与网络侧同学有效沟通的“连接人”的角色,求学这么多年其实也陆续学了不少的网络相关课程,本科的计算机网络、硕士的高等计网等,不过当时大多都停留在理论层面,趁

    2024年02月05日
    浏览(92)
  • 【手把手带你学JavaSE】第六篇:类和对象

    对了!给大家推荐一个刷题学习、面试神器——牛客网 里面有非常多的题库,跟面试经验~非常的良心!! 什么是类? 什么是对象? 怎么去理解这两个抽象的概念呢? Java是一门纯面向对象的语言(Object Oriented Program,继承OOP),在面向对象的世界里,一切皆为对象。 面向对象

    2023年04月20日
    浏览(57)
  • 从0手把手带你搭建pytorch深度学习

    目录 一、查看电脑有NVIDIA显卡没 二、更新电脑驱动 三、安装CUDA ToolKit和CUDNN 1、查看显卡驱动版本 2、查看合适的CUDA版本 3、下载CUDA ToolKit 4、安装CUDA 5、查看是否安装成功 6、安装CUDNN 7、CUDNN配置 四、安装anaconda 五、安装pycharm 六、搭建pytorch深度学习环境 1、进入Anaconda Pr

    2024年02月07日
    浏览(55)
  • 手把手带你实现DQN(TensorFlow2)

            大家好,今天给大家带来DQN的思路及实现方法。         关于DQN,就不用我多做介绍了,我会以最简短明白的阐述讲解DQN,尽量让你在10分钟内理清思路。         非常重要的一点!!!         非常重要的一点!!!我在GitHub上下载了DQN代码,跑完后,我重写一

    2023年04月08日
    浏览(58)
  • 手把手带你做一套毕业设计-征程开启

     本文是《Vue + SpringBoot前后端分离项目实战》专栏的开篇,文本将会包含我们创作这个专栏的初衷,专栏的主体内容,以及我们专栏的后续规划。关于这套毕业设计的作者呢前端部分由狗哥负责,服务端部分则由天哥操刀。我们力求毕业生或者新手通过学完本专栏,可以开心

    2023年04月10日
    浏览(182)
  • 实战项目:手把手带你实现一个高并发内存池

    1.这个项目做的是什么? 当前项目是实现一个高并发的内存池,他的原型是google的一个开源项目tcmalloc,tcmalloc全称Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关的函数(malloc、free)。 2.项目目标 模拟实现出一个自己的高

    2023年04月26日
    浏览(74)
  • 手把手带你啃透比特币白皮书-摘要

    很多人虽然了解了区块链,也可能参与了一些项目,但是可能没有见过比特币白皮书,也没有读过。我接下来就要和大家聊一聊,什么是白皮书,尤其是来给大家精读一下比特币的白皮书。 通过比特币白皮书,你能够 了解到真正的白皮书应该是什么样形式的 。因为很多人可

    2024年02月02日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包