Work Break II 解题心得

来源:互联网 发布:高通骁龙开核软件 编辑:程序博客网 时间:2024/05/17 00:09

Work Break II 解题心得

来源:https://leetcode.com/problems/word-break-ii/description/

题目复述

输入一个待分解的字符串s,一个包含多个单词的字典dict
例如:

s = "catsanddog";dict = {"cat", "cats", "and", "sand", "dog"};

按照字典dict的单词将s分解为多段的一句话
例如如下分解:

"cats and dog";

输出为所有分解可能的数组,对于上述输入有如下输出:

{"cats and dog", "cat sand dog"};

解题思路

!坑:需要解出所有可能的句子分解形式
1. 只求得一种句子分解形式的解:

n为字符串s的长度isBreak(i) : 表示子字符s(i:n)是否可以分解,如果可以分解则值为里i最近的下一个单词起始位置,如果不能分解则值为-1所以使用状态转移方程:isBreak(i) = k,  (isBreak(k) != -1)isBreak(i) = -1,  (isBreak(k) == -1)最后输出时从0位置开始向后找下一个单词的分割位置,直到s的末尾,则输出一个work-break
  1. 分析获取多个解的情况,修改isBreak(k)的数据结构,使其保存布不止一个值,而是多个值
n为字符串s的长度isBreak(i) : 结构为一个vector,指示子字符s(i:n)是否可以分解,如果可以分解则保存多个下一个单词的起始位置,如果不可以分解则vector的大小为0所以使用状态转移方程:isBreak(i).push_back(k),  (isBreak(k) != -1, k>i)isBreak(i).size()==0,  (isBreak(k) == -1, forall k>i)最后输出时从0位置开始向后找下一个单词的分割位置,这是一个深度优先遍历的过程,每个位置的多个值相当于树的多个分支;直到s的末尾,即为树的叶子节点,则保存一个work-break

解题源代码

https://github.com/zhanzongyuan/leetcode/blob/86704c94fbd268bdc7ad89defdb1ec41507cfac2/140_Word%20Break%20II.cpp