1. Word Break

  题目链接

  题目要求:

  Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.

  For example, given
  s = "leetcode",
  dict = ["leet", "code"].

  Return true because "leetcode" can be segmented as "leet code".

  博文Word Break -- LeetCode提及了动态规划的思想:

  首先我们要决定要存储什么历史信息以及用什么数据结构来存储信息。然后是最重要的递推式,就是如从存储的历史信息中得到当前步的结果。最后我们需要考虑的就是起始条件的值。

  下边是该博文对该题目的分析:

  首先我们要存储的历史信息res[i]是表示到字符串s的第i个元素为止能不能用字典中的词来表示,我们需要一个长度为n的布尔数组来存储信息。然后假设我们现在拥有res[0,...,i-1]的结果,我们来获得res[i]的表达式。思路是对于每个以i为结尾的子串,看看他是不是在字典里面以及他之前的元素对应的res[j]是不是true,如果都成立,那么res[i]为true,写成式子是

  

  具体程序如下:

 class Solution {
public:
bool wordBreak(string s, unordered_set<string>& wordDict) {
int szS = s.size();
if(szS == )
return false; vector<bool> dp(szS + , false);
dp[] = true;
for(int i = ; i < szS + ; i++)
{
for(int j = i - ; j > -; j--)
{
if(dp[j] && wordDict.find(s.substr(j, i - j)) != wordDict.end())
{
dp[i] = true;
break;
}
}
} return dp[szS];
}
};

  2. Word Break II

  题目链接

  题目要求:

  Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.

  Return all such possible sentences.

  For example, given
  s = "catsanddog",
  dict = ["cat", "cats", "and", "sand", "dog"].

  A solution is ["cats and dog", "cat sand dog"].

  其实这道题比上一道题理解来得容易,直接用Brute Force或者想直接利用上一题的结果来得到最终结果,都会超时。具体的,就是对输入进行检查,看看输入是否可以分解的,这样就可以跟超时了。

  Brute Force程序:

 class Solution {
public:
bool isValid(string s, unordered_set<string>& wordDict)
{
return wordDict.find(s) != wordDict.end();
} void dfs(string s, string tmp, vector<string>& res, unordered_set<string>& wordDict)
{
if (s.size() == )
{
tmp.pop_back(); // delete blank space
res.push_back(tmp);
return;
} int sz = s.size();
for(int i = ; i < sz + ; i++)
{
string str = s.substr(, i);
if(isValid(str, wordDict))
dfs(s.substr(i), tmp + str + " ", res, wordDict);
}
} vector<string> wordBreak(string s, unordered_set<string>& wordDict) {
vector<string> res;
int szS = s.size();
if(szS == )
return res; vector<bool> dp(szS + , false);
dp[] = true;
for(int i = ; i < szS + ; i++)
{
for(int j = i - ; j > -; j--)
{
if(dp[j] && wordDict.find(s.substr(j, i - j)) != wordDict.end())
{
dp[i] = true;
break;
}
}
} if(dp[szS])
dfs(s, "", res, wordDict); return res;
}
};

  利用上一题的结果:

 class Solution {
public:
bool isValid(string s, unordered_set<string>& wordDict)
{
return wordDict.find(s) != wordDict.end();
} void dfs(string s, string tmp, vector<string>& res, vector<int> inDictPos, unordered_set<string>& wordDict)
{
if (s.size() == )
{
tmp.pop_back(); // delete blank space
res.push_back(tmp);
return;
}
int sz = inDictPos.size();
if (sz > )
{
for (int i = ; i < sz; i++)
{
int diff = inDictPos[i] - inDictPos[];
if (diff <= s.size())
{
string subStr = s.substr(, diff);
if (isValid(subStr, wordDict))
{
vector<int> _inDictPos(inDictPos);
_inDictPos.erase(_inDictPos.begin(), _inDictPos.begin() + i);
string tmpStr = s.substr(diff);
dfs(s.substr(diff), tmp + subStr + " ", res, _inDictPos, wordDict);
}
}
}
}
} vector<string> wordBreak(string s, unordered_set<string>& wordDict) {
// Implemented in Word Break I
int szS = s.size();
vector<bool> dp(szS + , false);
vector<int> inDictPos;
dp[] = true;
inDictPos.push_back();
for(int i = ; i < szS + ; i++)
{
for(int j = i - ; j > -; j--)
{
if(dp[j] && wordDict.find(s.substr(j, i - j)) != wordDict.end())
{
dp[i] = true;
inDictPos.push_back(i);
break;
}
}
} vector<string> res;
if(dp[szS])
dfs(s, "", res, inDictPos, wordDict); return res;
}
};

  相比较之下,当然只用BF就够了,而且还来得简单。

LeetCode之“动态规划”:Word Break && Word Break II的更多相关文章

  1. leetcode 140 单词拆分2 word break II

    单词拆分2,递归+dp, 需要使用递归,同时使用记忆化搜索保存下来结果,c++代码如下 class Solution { public: //定义一个子串和子串拆分(如果有的话)的映射 unorder ...

  2. leetcode@ [211] Add and Search Word - Data structure design

    https://leetcode.com/problems/add-and-search-word-data-structure-design/ 本题是在Trie树进行dfs+backtracking ...

  3. (*medium)LeetCode 211.Add and Search Word - Data structure design

    Design a data structure that supports the following two operations: void addWord(word) bool search(w ...

  4. LeetCode 5:Given an input string, reverse the string word by word.

    problem: Given an input string, reverse the string word by word. For example: Given s = "the sk ...

  5. Java for LeetCode 211 Add and Search Word - Data structure design

    Design a data structure that supports the following two operations: void addWord(word)bool search(wo ...

  6. [LeetCode] 211. Add and Search Word - Data structure design 添加和查找单词-数据结构设计

    Design a data structure that supports the following two operations: void addWord(word) bool search(w ...

  7. Leetcode之动态规划(DP)专题-264. 丑数 II(Ugly Number II)

    Leetcode之动态规划(DP)专题-264. 丑数 II(Ugly Number II) 编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n ...

  8. Leetcode之动态规划(DP)专题-122. 买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II)

    Leetcode之动态规划(DP)专题-122. 买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II) 股票问题: 121. 买卖股票的最佳时机 122. ...

  9. Leetcode之动态规划(DP)专题-63. 不同路径 II(Unique Paths II)

    Leetcode之动态规划(DP)专题-63. 不同路径 II(Unique Paths II) 初级题目:Leetcode之动态规划(DP)专题-62. 不同路径(Unique Paths) 一个机 ...

  10. 【LeetCode】819. Most Common Word 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 正则+统计 日期 题目地址:https://leet ...

随机推荐

  1. 23 服务的绑定启动Demo3

    MainActivity.java package com.example.day23_service_demo3; import com.example.day23_service_demo3.My ...

  2. Spring之MVC模块

    Spring MVC的Controller用于处理用户的请求.Controller相当于Struts 1里的Action,他们的实现机制.运行原理都类似 Controller是个接口,一般直接继承Ab ...

  3. PLSQL实现分页查询

    --集合实现游标查询 CREATE OR REPLACE PACKAGE emppkg IS TYPE t_record IS RECORD( rn INT, empno emp.empno%TYPE ...

  4. ORACLE数据库学习之逻辑结构

     逻辑结构 数据库逻辑结构包含表空间.段.范围(extent).数据块和模式对象. (一)表空间 一个数据库划分为一个或多个逻辑单位,该逻辑单位称为表空间类似于sybase下的设备.(TABLES ...

  5. Mybatis源码分析之缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  6. [maven学习笔记]第一节,认识maven,搭建maven开发环境,写第一个HelloWorld

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/40142771 maven官网:http://maven.apache.org/ 学习视 ...

  7. oracle对大对象类型操作:blob,clob,nclob

     1.基本介绍 Oracle和plsql都支持lob(large object) 类型,用来存储大数量数据,如图像文件,声音文件等.Oracle 9i realse2支持存储最大为4g的数据,or ...

  8. install_driver(Oracle) failed: Can't load `.../DBD/Oracle/Oracle.so' for module DBD::Oracle

    Description This section is from the "Practical mod_perl " book, by Stas Bekman and Eric C ...

  9. 【Vbox】centos虚拟机安装usb网卡驱动

    前面安装增强pack之后 usb设备是可以识别了,但是无法正常使用,应该是无线网卡驱动没有的原因. 查看usb设备 os:centos6.6 内核:2.6.32-504.el6.x86_64 [roo ...

  10. 【UNIX网络编程第三版】阅读笔记(一):代码环境搭建

    粗略的阅读过<TCP/IP详解>和<计算机网络(第五版)>后,开始啃这本<UNIX网络编程卷一:套接字联网API>,目前linux下的编程不算太了解,在阅读的过程中 ...