今天继续深入学习动态规划,分析“拆分词句”这一案例,解题的关键和难点主要在于问题状态的分析。

牛客链接

题目:给定一个字符串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)状态过程中需要知道的小问题的状态,所谓的小问题们之间又有着相对的小问题和大问题的关系,层层递进,最后求出想要的结果

分析该问题的四个角度分析:

  1. 状态定义F(i):字符串的前i个字符是否可以在被分割后在词典中找到能找到状态为true,反之为false
  2. 状态间的转移方程定义:F(i) = j < i && F(j) && [j + 1,i]
  3. 状态的初始化:F(0) = true
  4. 返回结果: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()];}
}

完!

【动态规划】拆分词句相关推荐

  1. [LeetCode] Word Break II 拆分词句之二

    [LeetCode] Word Break II 拆分词句之二 Given a string s and a dictionary of words dict, add spaces in s to ...

  2. 动态规划——Word Break 拆分词句【LeetCode】

    题目链接:https://leetcode.com/problems/word-break/description/ Given a non-empty string s and a dictiona ...

  3. 【Leetcode】139. 拆分词句(Word Break)

    Leetcode - 139 Word Break (Medium) 题目描述:给定一个字符串 s 与字典 wordDict,判断 s 是否能拆分成 wordDict 中的子字符串. Input: s ...

  4. (每日一练java)CC12 拆分词句

    描述 给定一个字符串s和一组单词dict,判断s是否可以用空格分割成一个单词序列,使得单词序列中所有的单词都是dict中的单词(序列可以包含一个或多个单词). 例如: 给定s="nowcod ...

  5. CC12拆分词句C++

    链接: https://www.nowcoder.com/practice/5f3b7bf611764c8ba7868f3ed40d6b2c?tpId=46&tqId=29041&tP ...

  6. C++【算法】【动态规划问题】

    目录 一.斐波那契数列 二.字符串分割 三.三角矩阵​​​​​​​ 四.路径总数​​​​​​​ 五.最小路径和 六.背包问题 七.回文串分隔 八.编辑距离 九.不同子序列 动态规划是在将大问题转化为小 ...

  7. 牛客竞赛每日俩题 - 动态规划1

    目录 DP入门(存储之前状态以简化) DP解决最短路问题 DP入门(存储之前状态以简化) 拆分词句_牛客题霸_牛客网 思路: 方法:动态规划 状态:         子状态:前1 , 2 , 3 , ...

  8. 动态规划(持续更新、整理)

    动态规划 记忆化搜索 不同路径:leetcode-62 分割回文串:leetcode-131 单词拆分II:leetcode-140 戳气球:leetcode-312 零钱兑换:leetcode-32 ...

  9. 数据结构与算法基本思想

    目录 二分查找 八大排序 特点 冒泡排序 快速排序 直接插入排序 折半插入排序 希尔排序 简单选择排序 堆排序 二路归并排序 基数排序 二叉查找树(二叉排序树) 哈希表(散列表) 1.概念 2.特点 ...

最新文章

  1. iOS开发多线程篇—自定义NSOperation
  2. jQuery 对AMD的支持(Require.js中如何使用jQuery)
  3. 【IKExpression】IKExpressionV2.0简易表达式解析器
  4. linux mysql 备份脚本_linux下mysql备份脚本
  5. vue 中基于html5 drag drap的拖放
  6. 将指定内容写入目标文件(日志)
  7. ISP PIPLINE (六) AWB
  8. 拓端tecdat|R语言MCMC的rstan贝叶斯回归模型和标准线性回归模型比较
  9. 窗体传值,子窗体,父窗体,反射,reflection,windows,组策略,gpedit.msc,动态创建窗体,谢谢...
  10. [Go实战]goFrame框架初次使用
  11. 基于单片机USB接口的温度控制器
  12. 【读书笔记】《CSS新世界》—— 第一章 概述
  13. 浅谈0-day漏洞的在野利用
  14. 【剧透】2017云栖大会•北京峰会——企业云上业务优化专场
  15. 数据库连接超时和go away、如何检测数据库的最大连接数
  16. 基于java的cad_基于JavaCAD架构的IP知识产权保护
  17. 运行Ubuntu的HP笔记本合上盖子不休眠也不断网
  18. C++ 查重(码蹄集 新手村)
  19. 基于java+SpringBoot+HTML+MySQL精准扶贫网站的设计与实现
  20. 收集到的cmd基本命令快捷打开方式

热门文章

  1. linux fstab 错误,Linux下fstab修改错误了如何修复
  2. React生命周期执行顺序详解
  3. mac2600r_水星MAC2600R路由器登录密码是多少?
  4. JavaScript图中以编程方式平移和缩放
  5. halcon 畸变图像校正与长度测量
  6. SVN 中trunk、branches、tags都什么意思?
  7. python3.x 基础三:字符集问题
  8. JKTD-1000型铁电材料测试仪
  9. 软件测试面试思路技巧和方法分享,学到就是赚到
  10. 大学课程--计算机网络