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

news2024/11/17 3:48:07

139、单词拆分

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

状态转移方程

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

 对于输入的字符串 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下标开始是否能够拼出

联系框架

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

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

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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1385440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实现零的突破--国内首款兼容6Pin光耦栅极驱动器SLM34x系列SLM341

SLM34x系列SLM341是单通道兼容光耦的隔离式栅极驱动器产品&#xff0c;适用于驱动IGBT、MOSFET。其峰值驱动电流3.0A以及有不同的UVLO电压。与光耦栅极驱动器相比&#xff0c;其性能和可靠性都得到显著的提升&#xff0c;同时保持了对光耦栅极隔离驱动器管脚的兼容。性能提升包…

喜报|盘古信息入选多市中小企业数字化转型试点城市牵引单位/服务商名单

近期&#xff0c;为深入贯彻落实党中央、国务院关于支持中小企业创新发展、加快中小企业数字化转型系列决策部署&#xff0c;财政部、工业和信息化部近日联合印发通知&#xff0c;组织开展中小企业数字化转型城市试点工作&#xff0c;东莞市、武汉市、南昌市等多地经济和信息化…

国科大-自然语言处理复习

自然语言处理复习 实体关系联合抽取流水线式端到端方法 检索式问答系统流水线方式信息检索&#xff08;IR&#xff09;阶段阅读理解&#xff08;RC&#xff09;阶段基于证据强度的重排基于证据覆盖的重排结合不同类型的聚合 端到端方式Retriever-Reader的联合学习基于预训练的R…

科创板涨跌幅限制20%,上海怎么开参考表账户佣金费率最低?万一是哪家证券公司?

科创板是中国证券市场上的一类创新性企业板块&#xff0c;全称为科技创新板。科创板以支持科技创新和高新技术产业为目标&#xff0c;主要面向科技创新型企业和高新技术企业。科创板的设立旨在为创新型企业提供更加灵活、开放、市场化的融资和退出机制&#xff0c;以加快科技创…

【软件测试学习笔记1】测试基础

1.软件测试的定义 软件的定义&#xff1a;控制计算机硬件工作的工具 软件的基本组成&#xff1a;页面客户端&#xff0c;代码服务器&#xff0c;数据服务器 软件产生的过程&#xff1a;需求产生&#xff08;产品经理&#xff09;&#xff0c;需求文档&#xff0c;设计效果图…

怎样获取power shell 的全部可用命令?3/5(篇幅有点长,分成5份)

在power shell 窗口中&#xff0c;有一个获取全部可用命令的命令&#xff1a;get-command&#xff0c;获取到的命令有1640多个&#xff0c;够学习了吧&#xff1f;那么&#xff0c;power shell 命令有哪些类别呢&#xff1f; PowerShell命令可以分为以下几类&#xff1a; Cmd…

使用composer构建软件包时文件(夹)权限设置

在构建软件包的时候你可能会需要对包源内文件或文件夹的权限做出相应的调整&#xff0c;以确保软件包在部署到客户端后可以正常运行。在此之前我们先来了解一下Apple文件系统内文件或文件夹的权限设定。 常见的文件或文件夹会有Owner, Group, Everyone这三种类型的所有权&#…

经典文献阅读之--TwinLiteNet(可行驶区域和车道分割的高效轻量级模型)

0. 简介 对于自动驾驶来说语义分割是自动驾驶中理解周围环境的一项常见任务。可行驶区域分割和车道检测对于道路上安全且高效的导航尤为重要。为了满足自动驾驶汽车中可行驶区域和车道分割的高效轻量级&#xff0c;《TwinLiteNet: An Efficient and Lightweight Model for Dri…

反射助你无痛使用Semantic Kernel接入离线大模型

本文主要介绍如何使用 llama 的 server 部署离线大模型&#xff0c;并通过反射技术修改 Semantic Kernel 的 OpenAIClient 类&#xff0c;从而实现指定端点的功能。最后也推荐了一些学习 Semantic Kernel 的资料&#xff0c;希望能对你有所帮助。 封面图片&#xff1a; Dalle3 …

JVM篇--Java内存区域高频面试题

java内存区域 1 Java 堆空间及 GC&#xff1f; 首先我们要知道java堆空间的产生过程&#xff1a; 即当通过java命令启动java进程的时候&#xff0c;就会为它分配内存&#xff0c;而分配内存的一部分就会用于创建堆空间&#xff0c;而当程序中创建对象的时候 就会从堆空间来分…

图像处理-像素位置的一阶导数和二阶导数

图像处理-像素位置的一阶导数和二阶导数 空间卷积是一种图像处理中常用的技术&#xff0c;用于计算图像中每个像素位置的一阶导数和二阶导数。在这里将解释如何使用卷积操作来实现这些导数的计算。 一阶导数和二阶导数的性质&#xff1a; 一阶导数通常产生粗边缘&#xff1b…

redis原理(二)数据结构

redis可以存储键与5种不同数据结构类型之间的映射&#xff1a; String类型的底层实现只有一种数据结构&#xff0c;也就是动态字符串。而List、Hash、Set、ZSet都由两种底层数据结构实现。通常我们把这四种类型称为集合类型&#xff0c;它们的特点是一个键对应了一个集合的数据…

小程序系列--6.全局配置

一. 全局配置文件及常用的配置项 二、window 1. 小程序窗口的组成部分 2. 了解 window 节点常用的配置项 3. 设置导航栏的标题 4. 设置导航栏的背景色 5. 设置导航栏的标题颜色 6. 全局开启下拉刷新功能 7. 设置下拉刷新时窗口的背景色 8. 设置下拉刷新时 loading 的样…

【Python数据可视化】matplotlib之绘制高级图形:散点图、热力图、等值线图、极坐标图

文章传送门 Python 数据可视化matplotlib之绘制常用图形&#xff1a;折线图、柱状图&#xff08;条形图&#xff09;、饼图和直方图matplotlib之设置坐标&#xff1a;添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…

超声波清洗机真有用吗?眼镜党需注意!别被错误洗眼镜方法误导

超声波清洗机洗眼镜真的有用吗&#xff1f;眼镜党朋友一定要注意了&#xff0c;眼镜清洗可不能有一点马虎的哈&#xff01; 眼镜是很多人日常生活中不可或缺的用品&#xff0c;然而清洁眼镜却是一个让人头疼的问题。随着科技的发展&#xff0c;超声波清洗机作为一种新兴的清洁…

《WebKit 技术内幕》之二: HTML 网页和结构

第二章 HTML 网页和结构 HTML网页是利用HTML语言编写的文档&#xff0c;HTML是半结构化的数据表现方式&#xff0c;它的结构特征可以归纳为&#xff1a;树状结构、层次结构和框结构。 1.网页构成 1.1 基本元素和树状结构 HTML网页使用HTML语言撰写的文档&#xff0c;发展到今…

实战 | 某电商平台类目SKU数获取与可视化展示

一、项目背景 最近又及年底&#xff0c;各类分析与规划报告纷至沓来&#xff0c;于是接到了公司平台类目商品增长方向的分析需求&#xff0c;其中需要结合外部电商平台做对比。我选择了国内某电商平台作为比较对象&#xff0c;通过获取最细层级前台类目下的SKU数以及结构占比&…

免费分享一套PyQt6图书管理系统(附带完整开发视频教程) Python入门项目实战,果断收藏了~~

大家好&#xff0c;我是python222_小锋老师&#xff0c;最近写了一套PyQt6图书管理系统源码&#xff0c;附带完整开发视频教程&#xff0c;作为Python学习者的入门实战项目&#xff0c;带大家一起入门学习Python技术&#xff0c;感谢大家支持&#xff0c;特来分享下哈。 项目实…

java小游戏——动漫美女拼图

1&#xff1a;继承 1.1 继承概述 首先&#xff0c;我们来说一下&#xff0c;什么是继承&#xff1a; 继承是面向对象三大特征之一(封装&#xff0c;继承和多态) 可以使得子类具有父类的属性和方法&#xff0c;还可以在子类中重新定义&#xff0c;追加属性和方法 也就是说&…

生日视频模板-试试这样制作

视频制作已经成为表达情感、记录生活的重要方式。尤其在生日这样的特殊日子&#xff0c;一份个性化的视频祝福不仅能让人感到温馨&#xff0c;还能成为长久珍藏的回忆。那么&#xff0c;如何快速制作出精美的生日模版视频呢&#xff1f;下面就给大家介绍几种可以制作生日模版的…