【动态规划】拆分词句
今天继续深入学习动态规划,分析“拆分词句”这一案例,解题的关键和难点主要在于问题状态的分析。
牛客链接
题目:给定一个字符串s和一组单词dict,判断s是否可以用空格分割成一个单词序列,使得单词序列中所有的单词都是dict中的单词(序列可以包含一个或多个单词)。
例如:
给定s=“nowcode”;
dict=[“now”, “code”].
返回true,因为"nowcode"可以被分割成"now code".
如果没有学习过动态规划思想的同学,面对这样的一个问题多少有点一筹莫展,看似简单的问题却不知怎么入手,可能会想用暴力解法,把nowcode分成n和owcode,看是否都在词典dict中出现,不行的话,在尝试分成no和wcode,直到将这个字符串的所有分割可能都尝试一遍,如果都不行说明该字符串不可拆分,反之则可以。
书面想法挺不错,但如果真的要实现到本题中,未免大题小做,没有必要,用动态规划思想就可以用简单的代码解决该问题。
想要知道F(1),F(2),…,F(6)的状态实际上的方法和求F(7)的方法实际实际上是一模一样滴,这些个状态就是求解F(7)状态过程中需要知道的小问题的状态,所谓的小问题们之间又有着相对的小问题和大问题的关系,层层递进,最后求出想要的结果
分析该问题的四个角度分析:
- 状态定义F(i):字符串的前i个字符是否可以在被分割后在词典中找到能找到状态为true,反之为false
- 状态间的转移方程定义:F(i) = j < i && F(j) && [j + 1,i]
- 状态的初始化:F(0) = true
- 返回结果:F(s.length())
代码展示:
import java.util.*;
public class Solution {public boolean wordBreak(String s, Set<String> dict) {boolean[] canBreak = new boolean[s.length() + 1]; //用来记录前i个状态canBreak[0] = true; //初始状态for(int i = 1;i <= s.length();i ++) {for(int j = 0; j < i;j ++) {//需要注意索引是从0开始,并且substring方法的下标范围前开后闭的特点canBreak[i] = canBreak[j] && dict.contains(s.substring(j,i));//在循环过程中如果该状态为true,说明前i个字符是可以被分割后在词典中找到的,可以直接跳出本轮循环,去求下一个状态的值if(canBreak[i] == true) {break;}}}//返回结果return canBreak[s.length()];}
}
完!
【动态规划】拆分词句相关推荐
- [LeetCode] Word Break II 拆分词句之二
[LeetCode] Word Break II 拆分词句之二 Given a string s and a dictionary of words dict, add spaces in s to ...
- 动态规划——Word Break 拆分词句【LeetCode】
题目链接:https://leetcode.com/problems/word-break/description/ Given a non-empty string s and a dictiona ...
- 【Leetcode】139. 拆分词句(Word Break)
Leetcode - 139 Word Break (Medium) 题目描述:给定一个字符串 s 与字典 wordDict,判断 s 是否能拆分成 wordDict 中的子字符串. Input: s ...
- (每日一练java)CC12 拆分词句
描述 给定一个字符串s和一组单词dict,判断s是否可以用空格分割成一个单词序列,使得单词序列中所有的单词都是dict中的单词(序列可以包含一个或多个单词). 例如: 给定s="nowcod ...
- CC12拆分词句C++
链接: https://www.nowcoder.com/practice/5f3b7bf611764c8ba7868f3ed40d6b2c?tpId=46&tqId=29041&tP ...
- C++【算法】【动态规划问题】
目录 一.斐波那契数列 二.字符串分割 三.三角矩阵 四.路径总数 五.最小路径和 六.背包问题 七.回文串分隔 八.编辑距离 九.不同子序列 动态规划是在将大问题转化为小 ...
- 牛客竞赛每日俩题 - 动态规划1
目录 DP入门(存储之前状态以简化) DP解决最短路问题 DP入门(存储之前状态以简化) 拆分词句_牛客题霸_牛客网 思路: 方法:动态规划 状态: 子状态:前1 , 2 , 3 , ...
- 动态规划(持续更新、整理)
动态规划 记忆化搜索 不同路径:leetcode-62 分割回文串:leetcode-131 单词拆分II:leetcode-140 戳气球:leetcode-312 零钱兑换:leetcode-32 ...
- 数据结构与算法基本思想
目录 二分查找 八大排序 特点 冒泡排序 快速排序 直接插入排序 折半插入排序 希尔排序 简单选择排序 堆排序 二路归并排序 基数排序 二叉查找树(二叉排序树) 哈希表(散列表) 1.概念 2.特点 ...
最新文章
- iOS开发多线程篇—自定义NSOperation
- jQuery 对AMD的支持(Require.js中如何使用jQuery)
- 【IKExpression】IKExpressionV2.0简易表达式解析器
- linux mysql 备份脚本_linux下mysql备份脚本
- vue 中基于html5 drag drap的拖放
- 将指定内容写入目标文件(日志)
- ISP PIPLINE (六) AWB
- 拓端tecdat|R语言MCMC的rstan贝叶斯回归模型和标准线性回归模型比较
- 窗体传值,子窗体,父窗体,反射,reflection,windows,组策略,gpedit.msc,动态创建窗体,谢谢...
- [Go实战]goFrame框架初次使用
- 基于单片机USB接口的温度控制器
- 【读书笔记】《CSS新世界》—— 第一章 概述
- 浅谈0-day漏洞的在野利用
- 【剧透】2017云栖大会•北京峰会——企业云上业务优化专场
- 数据库连接超时和go away、如何检测数据库的最大连接数
- 基于java的cad_基于JavaCAD架构的IP知识产权保护
- 运行Ubuntu的HP笔记本合上盖子不休眠也不断网
- C++ 查重(码蹄集 新手村)
- 基于java+SpringBoot+HTML+MySQL精准扶贫网站的设计与实现
- 收集到的cmd基本命令快捷打开方式