单词拆分

作者:xiao_ben_zhu
链接:https://leetcode-cn.com/problems/word-break/solution/shou-hui-tu-jie-san-chong-fang-fa-dfs-bfs-dong-tai/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

给定一个非空字符串 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 思路
"leetcode"能否break,可以拆分为:"l"是否是单词表的单词、剩余子串能否break,"le"是否是单词表的单词、剩余子串能否break……
用 DFS 回溯,考察所有的拆分可能,指针从左往右扫描 s 串:
1. 如果指针的左侧部分是单词表中的单词,则对右侧的剩余子串,递归考察。
2. 如果指针的左侧部分不是单词表的单词,不用看了,回溯,考察别的分支。
在这里插入图片描述

    public boolean wordBreak(String s, List<String> wordDict) {return dfs(s, 0, wordDict);}public boolean dfs(String s, int start, List<String> wordDict){if(start == s.length()){return true;}for(int i=start;i<s.length();i++){if(wordDict.indexOf(s.substring(start, i+1))!=-1 && dfs(s, i+1, wordDict)){return true;}}return false;}

该方法会大量重复计算:
在这里插入图片描述
加入记忆化
我们用一个数组,存计算的结果,数组索引为指针位置,值为计算的结果。下次遇到相同的子问题,直接返回数组中的缓存值。

    public boolean wordBreak(String s, List<String> wordDict) {Boolean[] memory = new Boolean[s.length()];return dfs(s, 0, wordDict, memory);}public boolean dfs(String s, int start, List<String> wordDict, Boolean[] memory){if(start == s.length()){return true;}if(memory[start]!=null)return memory[start];for(int i=start;i<s.length();i++){if(wordDict.indexOf(s.substring(start, i+1))!=-1 && dfs(s, i+1, wordDict, memory)){memory[start] = true;return true;}}memory[start] = false;return false;}

动态规划

  • s 串能否分解为单词表的单词,即:前 s.length 个字符的 s 串能否分解为单词表单词。
  • 将大问题分解为规模小一点的子问题,规模就是这个长度:
  • 前 i 个字符的子串能否分解成单词表单词 + 剩余子串是否为单个单词。

状态转移方程
在这里插入图片描述

  • [0, i][0,i] 区间子串 的 dp[i+1]dp[i+1] 是否为真,取决于两部分:
  • 它的前缀子串 [0, j-1][0,j−1] 的 dp[j]dp[j] ,是否为真
    剩余子串 [j,i][j,i] ,是否是一个单词表单词
    base case
    dp[0] = true。长度为 0 的子串是由单词表的单词组成的。是很诡异。
    但,这只是为了让边界情况也能满足状态转移方程,即上图:当黄色部分为空字符串时,dp[i+1]dp[i+1] 全然取决于 [0,i][0,i] 子串是否为一个单词表单词。
    所以我们让 dp[0] = true
public boolean wordBreak(String s, List<String>wordDict){boolean[] dp = new boolean[s.length()+1];dp[0] = true;for(int i=1;i<=s.length();i++){for(int j=0;j<i;j++){String sub = s.substring(j, i);if(dp[j]&&wordDict.contains(sub)){dp[i] = true;break;}}}return dp[s.length()];}

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

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

相关文章

centos Error: Cannot find a valid baseurl for repo: base 解决方法

参考 https://arstech.net/centos-6-error-yumrepo-error-all-mirror-urls-are-not-using-ftp-http/ 【1】报错现场&#xff1b; 原因&#xff0c; 软件镜像地址有误&#xff0c;需要手工录入&#xff1b; 2、编辑文件&#xff0c; /etc/yum.repos.d/CentOS-Base.repo. 找到…

精选30道Java多线程面试题

转载自 精选30道Java多线程面试题 1、线程和进程的区别 2、实现线程有哪几种方式&#xff1f; 3、线程有哪几种状态&#xff1f;它们之间如何流转的&#xff1f; 4、线程中的start()和run()方法有什么区别&#xff1f; 5、怎么终止一个线程&#xff1f;如何优雅地终止线程&…

Vue 媒体处理(摄像头,截图,播放本地视频)

Vue 媒体处理&#xff08;摄像头&#xff0c;截图&#xff0c;播放本地视频&#xff09; 一. 打开摄像头 javascriptthis.constraint {// video属性设置video: {width: 300,height: 300,},// audio属性设置audio: true,}navigator.mediaDevices.getUserMedia(this.constrain…

how to install nc on centos8及nc应用

转自&#xff1a; https://linuxconfig.org/install-netcat-on-redhat-8 【README】 nc 是什么&#xff1f; nc&#xff0c;全名叫netcat&#xff0c;它可以用来完成很多的网络功能&#xff0c;譬如端口扫描、建立TCP/UDP连接&#xff0c;数据传输、网络调试等等&#xff0c…

大型网站架构利器-CDN技术

转载自 大型网站架构利器&#xff0d;CDN技术概念CDN这个概念相信大家都比较耳熟&#xff0c;到底什么是CDN呢&#xff1f;CDN&#xff0c;全称为Content Delivery Network&#xff0c;即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环…

centos8启动zk集群失败:zk Error contacting service. It is probably not running.

【README】在 192.168.163.201 机器上 启动zk &#xff0c;并查看zk 这台&#xff1b; 即 集群只有2台机器&#xff0c; 201 202 --ZOO.cfg# The number of milliseconds of each tick tickTime2000 # The number of ticks that the initial # synchronization phase can tak…

动态调整canvas时的问题

动态调整canvas大小时必须重新获取上下文&#xff08; canvas.getContext(‘2d’) &#xff09;及重新设置ctx的属性&#xff0c;否则会导致后续的绘制操作无效 动态调整canvas: var canvas document.getElementsByTagName("canvas")[0];var ctx canvas.getConte…

Maven精选系列--标准目录结构

转载自 Maven精选系列--标准目录结构Maven的目录结构和传统的项目有所差别&#xff0c;下面是一个jar包通常有的目录结构。src/main/java&#xff1a;源代码目录 src/main/resources&#xff1a;资源文件目录 src/test/java&#xff1a;测试代码目录 src/test/resources&#x…

java本地连接zk集群

【README】基于centos8 搭建zookeeper 集群&#xff0c;refer2 https://blog.csdn.net/PacosonSWJTU/article/details/111409079 【1】创建maven项目 添加依赖后&#xff0c; pom.xml 长这个样子&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0&quo…

Java IO(BIO, NIO, AIO) 总结

文章转载自&#xff1a;JavaGuide 目录BIO,NIO,AIO 总结同步与异步阻塞和非阻塞1. BIO (Blocking I/O)1.1 传统 BIO1.2 伪异步 IO1.3 代码示例1.4 总结2. NIO (New I/O)2.1 NIO 简介2.2 NIO的特性/NIO与IO区别2.3 NIO 读数据和写数据方式2.4 NIO核心组件简单介绍2.5 代码示例3.…

Maven精选系列--介绍与安装

转载自 Maven精选系列--介绍与安装Maven介绍Maven是一个项目管理工具&#xff0c;用来管理项目的生命周期&#xff0c;如项目中各个项目之间的依赖管理&#xff0c;项目中使用到的jar包依赖管理&#xff0c;还有许多项目构建的插件等。使用Maven最大的好处就是不再需要我们手工…

java本地创建zk节点

【README】 java本地连接zk cluster, refer to https://blog.csdn.net/PacosonSWJTU/article/details/111404364; 【1】 创建zk节点 star &#xff08;明星节点&#xff09; /*** 测试 zk * author pacoson**/ public class TestZK {/*** zk server 连接串 */private Stri…

Java8 Lambda总结

什么是Lambda&#xff1f; Lambda是一个匿名函数&#xff0c;我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像参数一样进行传递&#xff0c;称为行为参数化)。Lambda允许把函数作为一个方法的参数&#xff08;函数作为参数传递进方法中&#xff09;&#xff0c;要…

本地java【动态监听】zk集群节点变化

【README】搭建zk cluster&#xff0c; refer 2 https://blog.csdn.net/PacosonSWJTU/article/details/111404364 【1】 动态监听代码&#xff0c;需要写在 建立zk 连接的watcher 实现类里&#xff0c;如下&#xff1a; public class TestZK {/*** zk server 连接串 */privat…

架构师必须搞懂DNS,一篇文章就够了。

转载自 架构师必须搞懂DNS&#xff0c;一篇文章就够了。概念DNS&#xff0c;全称Domain Name System&#xff0c;即域名系统&#xff0c;搞清楚&#xff0c;它不是DNF地下城与勇士。DNS是怎么来的&#xff0c;我们知道要访问一个服务器的资源可以通过IP的形式访问&#xff0c;但…

Java 流式编程stream

目录什么是Stream&#xff1f;怎么创建Stream?Stream的中间操作Stream的终端操作什么是Stream&#xff1f; Stream它并不是一个容器&#xff0c;它只是对容器的功能进行了增强&#xff0c;添加了很多便利的操作,例如查找、过滤、分组、排序等一系列的操作。并且有串行、并行两…

本地java判断zk节点是否存在

【README】java 本地连接zk集群&#xff0c;https://blog.csdn.net/PacosonSWJTU/article/details/111404364 【1】判断节点是否存在 /*** 测试 zk * author pacoson**/ public class TestZK {/*** zk server 连接串 */private String connectString "192.168.163.20…

架构师必须掌握的各种编码:ASCII、ISO-8859-1、GB2312

转载自 架构师必须掌握的各种编码&#xff1a;ASCII、ISO-8859-1、GB2312编码在我们日常开发过程中经常有遇到&#xff0c;常见的编码格式有ASCII、ISO-8859-1、GB2312、GBK、GB18030、UNICODE、UTF-8、UTF-16等&#xff0c;其中GB2312、GBK、GB18030、UTF-8、UTF-16都可以用来…

vue 使用 el-image图片无法显示

问题&#xff1a;在vue 项目中使用 el-image 后&#xff0c;在图片路径无误的情况下显示图片加载失败 <el-carousel trigger"click" :height"carouselHeight"><el-image src"images/top1.jpg" fit"fill" style"height:…

java本地监听zk服务器节点【动态上下线】

【README】 java本地访问 zk cluster&#xff0c; refer 2 https://blog.csdn.net/PacosonSWJTU/article/details/111404364 【1】 客户端监听 zk节点变化 1&#xff09; zk客户端代码——http访问的客户端代码&#xff08;请求zk获取 http服务器的上下线信息&#xff09;…