LeetCode之“动态规划”:Word Break && Word Break II
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的更多相关文章
- leetcode 140 单词拆分2 word break II
单词拆分2,递归+dp, 需要使用递归,同时使用记忆化搜索保存下来结果,c++代码如下 class Solution { public: //定义一个子串和子串拆分(如果有的话)的映射 unorder ...
- leetcode@ [211] Add and Search Word - Data structure design
https://leetcode.com/problems/add-and-search-word-data-structure-design/ 本题是在Trie树进行dfs+backtracking ...
- (*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 ...
- 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 ...
- 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 ...
- [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 ...
- Leetcode之动态规划(DP)专题-264. 丑数 II(Ugly Number II)
Leetcode之动态规划(DP)专题-264. 丑数 II(Ugly Number II) 编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n ...
- 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. ...
- Leetcode之动态规划(DP)专题-63. 不同路径 II(Unique Paths II)
Leetcode之动态规划(DP)专题-63. 不同路径 II(Unique Paths II) 初级题目:Leetcode之动态规划(DP)专题-62. 不同路径(Unique Paths) 一个机 ...
- 【LeetCode】819. Most Common Word 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 正则+统计 日期 题目地址:https://leet ...
随机推荐
- 2014 BDTC 参会有感
中国大数据技术大会(Big Data Technology Conference,BDTC)是目前国内最具影响.规模最大的大数据领域的技术盛会.大会的前身是Hadoop中国云计算大会(Hadoop i ...
- EBS中使用JAVA方式发送HTML格式邮件
转自huan.gu专栏:http://blog.csdn.net/gh320/article/details/17174769 EBS中使用JAVA方式发送HTML格式邮件 一.开发工具:JDevel ...
- C++ ifstream,ofstream读写二进制文件
为什要吧数据存为二进制 这个嘛,是我个人习惯,一般,我们会把日志文件存为文本文件.数据文件存成二进制文件. 其实,我们接触的文件,比如图像.视频都是以二进制的形式存储的,要想查看这类数据,必须知道数据 ...
- [shiro学习笔记]第二节 shiro与web融合实现一个简单的授权认证
本文地址:http://blog.csdn.net/sushengmiyan/article/details/39933993 shiro官网:http://shiro.apache.org/ shi ...
- Oracle AP Invoice APIs
These APIs are handful when you want to do Insert, Update or Delete programmatically for some bus ...
- Linux2.6内核--抢占
[摘要]本文首先介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核(Preemptive Kernel)的区别.接着分析Linux下有两种抢占:用户态抢占(User Pree ...
- Java中把JSON和List结果集互转的代码片段整理
1.将JSON字符串转换成List结果集的方式: //查询结果集 PageDatums picPageDatums = pictureLibraryService.selectPagePictureF ...
- 【一天一道LeetCode】#114. Flatten Binary Tree to Linked List
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- UNIX环境高级编程——select、poll和epoll
一.select select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,事实上从现在看来,这也是它所剩不多的优点之一. select的一个缺点在于单个进程能够监视的文件描述符的数量 ...
- Hadoop-1.0.4伪分布安装与配置
1.采用伪分布模式安装 将hadoop-****.tar.gz复制到linux的/usr/local目录下. 2.解压,重命名 #tar -xzvf hadoop-1.0.4.ta ...