题目描述

输入一个字符串s和单词字典word,通过在字符串中添加空格来构造一个句子似的句子的每个单词都是合法的。
输入所有可能的句子

例如, 给出
s =”catsanddog”,
dict =[“cat”, “cats”, “and”, “sand”, “dog”].

输出 [“cats and dog”, “cat sand dog”]

题目解析

/***     0           1           2           3           4           5           6           7           8            9*0    c           ca          cat(1)      cats(1)     catsa       catsan      catsand     catsandd    catsanddo    catsanddog*1    a           at          ats         atsa        atsan       atsand      atsandd     atsanddo    atsanddog*2    t           ts          tsa         tsan        tsand       tsandd      tsanddo     tsanddog*3    s           sa          san         sand(1)     sandd       sanddo      sanddog*4    a           an          and(1)      andd        anddo       anddog*5    n           nd          ndd         nddo        nddog*6    d           dd          ddo         ddog*7    d           do          dog(1)*8    o           og*9    g*/

动态规划算法的思想一般要经历几个步骤

  • 划分阶段:把问题分为诺干个阶段。
  • 确定状态:问题发展到各个阶段时所处的情况用不同的状态表示出来。
  • 确定决策并写出状态转移方程:决策即逻辑,通过决策实现上一个状态像下一个状态的转移。确定了决策方案,那么状态转移方程就很容易给出。
  • 寻找边界条件:算法递归的终止条件。
  • 程序实现:通过以上步骤的确定之后,实现代码比较简单。

可以把s = catsanddog断句的全过程分为s.size() = 11个阶段,用k表示阶段变量。

通过初始化一个二维数组vector* dp = new vector[s.size()]来初始化状态表。dp[i][j]表示s的子串s.substr(i, j+1)是否在字典中。

vector words 用来记录过程中的词语。vector result 用来记录断好的句子。

确定好状态表之后,决策过程如下:
阶段是从字符串末尾向字符串首,也就是通过对角线搜索的方式。
比如


output(9, s, result, wordss, dp):
dp[9][0] = 0
dp[8][1] = 0
dp[7][2] = 1 => output(6, s, result, words, dp)
dp[6][3] = 0
dp[5][4] = 0
dp[4][5] = 0
dp[3][6] = 0
dp[2][7] = 0
dp[1][8] = 0
dp[0][9] = 0


output(6, s, result, words, dp)
dp[6][0] = 0
dp[5][1] = 0
dp[4][2] = 1 => output(3, s, result, words, dp)
dp[3][3] = 1 => output(2, s, result, words, dp)
dp[2][4] = 0
dp[1][5] = 0
dp[0][6] = 0
.
.
.
k表示的是从字符串开始最远可以偏移的位置

class Solution {
public:vector<string> wordBreak(string s, unordered_set<string> &dict) {vector<bool> *dp = new vector<bool>[s.size()];for (int i = 0;i < s.size();i++) {for (int j = 0;j < s.size() - i;j++) {if (dict.find(s.substr(i, j + 1)) != dict.end())dp[i].push_back(true);elsedp[i].push_back(false);}}vector<string> result; vector<string> words;output(s.size() - 1, s, result, words, dp);return result;}void output(int x, string s, vector<string> &result, vector<string> &words, vector<bool> *dp) {if (x == -1) {string sentence;for (int i = words.size() - 1;i >= 0;i--) {sentence+=words[i];if (i != 0) sentence += " ";}result.push_back(sentence);} else {for (int i = x;i >= 0;i--) { // 错误:for (int i = 0;i <= x;i--)if (dp[i][x - i]) {words.push_back(s.substr(i, x - i + 1));output(i - 1, s, result, words, dp);words.pop_back();}}}}
};

动态规划算法之断句问题相关推荐

  1. C#,动态规划问题中基于单词搜索树(Trie Tree)的单词断句分词( Word Breaker)算法与源代码

    分词是自然语言处理的基础,分词准确度直接决定了后面的词性标注.句法分析.词向量以及文本分析的质量.英文语句使用空格将单词进行分隔,除了某些特定词,如how many,New York等外,大部分情况下 ...

  2. 让机器学会断句:基于词典的Bigram分词算法

    目录 概述 从序列到图 Unigram 模型 Bigram 模型 实现 概述 分词是NLP任务Pipeline中的重要步骤,一般来说都需要将句子切分成词之后,才能进一步把词进行向量化,最终输出各种各样 ...

  3. 贪心、递归、递推以及动态规划算法的分析与对比

    PS:   头一次规规矩矩的按照论文的格式写文章,呵呵.虽然是小儿科的不能再小儿科的东西了..不过..也忽悠了6000多字~~嘿嘿..肯定写的不好,第一次嘛..所以..接受大家一切批评哈!...文章N ...

  4. 龙泉寺贤超法师:用AI为古籍经书识别、断句、翻译

    本文转载自:HyperAI超神经 内容提要:来自最强科研寺庙龙泉寺的贤超法师,近年来一直在研究人工智能与文献古籍的融合,目前,他已带领的<大藏经>团队实现 AI 自动标点.文白翻译.古籍文 ...

  5. 使用动态规划算法实现文献查重(C/C++实现)

    本篇文章是描述使用动态规划算法实现文献查重(C/C++实现)的程序. #include <stdio.h> #include <stdlib.h> #include <i ...

  6. Java动态规划算法从入门的到熟练

    文章目录 一.动态规划 1. 定义 2. 基本思想和策略 3. 解题思路 4. 使用情况 二.算法笔记 509. 斐波那契数 1137. 第 N 个泰波那契数 70. 爬楼梯 746. 使用最小花费爬 ...

  7. 矩阵连乘算法代码JAVA_矩阵连乘问题的动态规划算法(java)

    /** * 下面是矩阵连乘问题的动态规划算法 * 假设有6个矩阵: * A1 A2A3 A4 A5A6 * 30*35 35*15 15*5 5*10 10*20 20*25 则matrixChain ...

  8. 五大常用算法之二:动态规划算法

    基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移.一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划. 基本思想与策略 基本思想与分 ...

  9. 矩阵连乘问题(动态规划算法)

    动态规划算法思想简介: 将一个问题分解为多个子问题,这点和分治法类似,但是每个子问题不是独立的而是相互联系的,所以我们在求解每个子问题的时候可能需要重复计算到其他的子问题,所以我们将计算过的子问题的解 ...

最新文章

  1. 第二篇:Mysql---约束条件、修改表的结构、键值
  2. Homework 8 测试计划
  3. 【渝粤题库】广东开放大学 会展概论 形成性考核
  4. ant 彻底了解(转)
  5. 一步步学敏捷开发:6、Scrum的3种工件
  6. 【MyBatis框架】Mybatis开发dao方法第一部分
  7. GPT Plus Money!B O O M
  8. 李飞飞之后谷歌再失华裔高管,谷歌AI中国中心总裁李佳离职创业
  9. http status 400 – bad request 亚马逊_蛮拼的!这个亚马逊卖家为Prime Day做了这三大准备,销量暴涨58倍...
  10. bartender打印错误
  11. Ubuntu16.04装拼音/Sogou遇到的问题(卸载/重装 Fcitx / Fcitx Configuration、卸载/重装Sogou)
  12. 聚合支付与第四方支付平台的本质区别
  13. 京东FBP、LBP、SOP、SOPL 四种分别是什么意思?
  14. web漏洞-远端WWW服务支持TRACE请求
  15. 检查nmos管是否损坏
  16. 魔改车钥匙实现远程控车:(1)整体思路及控制方案实现
  17. jvm学习——18.垃圾回收之STW
  18. 洛谷题库答案(持续更新)
  19. 西门子S7-1200控制5轴伺服程序加维纶触摸屏画面案例
  20. 菏泽学院计算机学院郭琪琪,【北邮表白墙】表白贵校15级计算机学院小哥哥我男票周彧祺!撇撇,我等着你娶我呢,不要太晚哦~署名:来自北航的韩小之...

热门文章

  1. Python面向对象06/反射/双下方法
  2. 用c++写一个简单的钓鱼(集卡)程序
  3. python表达式_Python的表达式写法
  4. [BZOJ3895]取石子
  5. android延时摄影功能,学会这几招!让你玩转荣耀30夜景延时摄影
  6. 可爱的狮子(lion)
  7. 重要提醒:三星note20fe和三星s20fe哪个好-参数对比-三星note20fe和三星s20fe区别-哪个更值得入手-
  8. 【习题5】用Python完成新建文档写古诗+复制
  9. VUE-鼠标移入到目标区域变成小手模样
  10. HashMap底层原理(图文并茂,简单易懂)