LeetCode ||& Word Break && Word Break II(转)——动态规划
一、
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".
class Solution {
public:
bool wordBreak(string s, unordered_set<string> &dict) {
int len=s.length();
vector<bool> v(len+,false);
v[]=true;
for(int pos=;pos<len;pos++){
for(int i=pos;v[pos]&&i<len;i++){
if(dict.find(s.substr(pos,i-pos+))!=dict.end())
v[i+]=true;
}
}
return v[len];
}
};
二、
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"]
.
即不仅要确定字符串是否能被字典分割,还要找出所有可能的组合。参考word break那题的DP思路,首先,从尾部开始逆向看字符串 s ,循环截取一个存在的词(milestone 1),然后在截取的位置递归,继续向前看,继续截取。。。知道到达头部,此时组合出一种答案;然后进入milestone 1 处的下一次循环,如下图的milestone 1‘,截取另外一个词,找另外一个答案。。。
代码如下:
class Solution {
vector<string> midres;
vector<string> res;
vector<bool> *dp;
public:
vector<string> wordBreak(string s, unordered_set<string> &dict) {
int len = s.length(); dp = new vector<bool>[len];
for(int i=; i<len; ++i){
for(int j=i; j<len; ++j){
if(dict.find(s.substr(i, j-i+))!=dict.end()){
dp[i].push_back(true); //第二维的下标实际是:单词长度-1
}else{
dp[i].push_back(false); //数组第二维用vector,size不一定是n,这样比n*n节省空间
}
}
}
func(s, len-);
return res;
} void func(const string &s, int i){
if(i>=){
for(int j=; j<=i; ++j){ if(dp[j][i-j]){ //注意此处的第二个下标是 i-j,不是i,因为数组的第二维长度是不固定的,第二维的下标实际是单词长度-1 midres.push_back(s.substr(j, i-j+));
func(s, j-);
midres.pop_back(); //继续考虑for循环的下一个分段处
}
}
return;
}
else{
string str;
for(int k=midres.size()-; k>=; --k){ //注意遍历的顺序是倒序的
str += midres[k]; //注意此处是k,不是i
if(k>)
str += " ";
}
res.push_back(str);
return;
}
}
};
注意递归函数的技巧,用全局变量res来保存答案,每次递归成功到达头部时将此中间结果保存到res。
转自:http://blog.csdn.net/jiadebin890724/article/details/34829865
LeetCode ||& Word Break && Word Break II(转)——动态规划的更多相关文章
- leetcode 940. 不同的子序列 II (动态规划 ,字符串, hash,好题)
题目链接 https://leetcode-cn.com/problems/distinct-subsequences-ii/ 题意: 给定一个字符串,判断里面不相同的子串的总个数 思路: 非常巧妙的 ...
- 【LeetCode】140. Word Break II 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归求解 日期 题目地址:https://leetc ...
- [leetcode]244. Shortest Word Distance II最短单词距离(允许连环call)
Design a class which receives a list of words in the constructor, and implements a method that takes ...
- [LeetCode] 244. Shortest Word Distance II 最短单词距离 II
This is a follow up of Shortest Word Distance. The only difference is now you are given the list of ...
- 【一天一道LeetCode】#79. Word Search
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- 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 ...
- [LeetCode] 243. Shortest Word Distance 最短单词距离
Given a list of words and two words word1 and word2, return the shortest distance between these two ...
- [LeetCode] 245. Shortest Word Distance III 最短单词距离 III
This is a follow up of Shortest Word Distance. The only difference is now word1 could be the same as ...
- leetcode面试准备: Word Pattern
leetcode面试准备: Word Pattern 1 题目 Given a pattern and a string str, find if str follows the same patte ...
- LeetCode OJ:Word Search(单词查找)
Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...
随机推荐
- LeetCode(72) Edit Distance
题目 Given two words word1 and word2, find the minimum number of steps required to convert word1 to wo ...
- nginx+django+uwsgi+https 配置问题点
- ssl 证书申请 申请域名的网站申请下载对应文件即可 - nginx 配置 https [root@VM_2_29_centos conf]# nginx -t nginx: [emerg] u ...
- 在xcode上把你的app多语言国际化(NSLocalizedString)
1.到project->info->localizations 下面的加号,添加你需要的语言 千万不要删除 base 否虽然我不知道有什么用,我是删了整个storyboard没了,很 ...
- wireshark抓文件上传的包的结果记录
如果我们再一个表单中放了一个text的input 还放了一个file的input进行文件上传,此时用wireshark抓到的包应该是什么样子的呢 html代码 <form action=&quo ...
- Scrapy 应用之爬取《盗墓笔记》
爬取<盗墓笔记>和爬取<宦海沉浮>原理一样,但是使用了两种不同的追踪链接的方式,<盗墓笔记>使用的是跟踪下一页链接,直至没有下一页为止,<宦海沉浮>则是 ...
- Centos7 编译安装python3
step1:preparation $ yum install yum-utils make wget gcc $yum-builddep python step2:download $ wget h ...
- hdu 1848 sg——dfs&&打表双实现
Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- HDU-5423 Rikka with Tree。树深搜
Rikka with Tree 题意:给出树的定义,给出树相似的定义和不同的定义,然后给出一棵树,求是否存在一颗树即和其相似又与其不同.存在输出NO,不存在输出YES. 思路:以1号节点为根节点,我们 ...
- SQL indexOf、lastIndexOf
DECLARE @Name NVARCHAR (50)SET @Name = 'abcd.12345.efght' DECLARE @Position INT --sql first indexofS ...
- 【Luogu】P1155双栈排序(二分图)
题目链接在此 此题一开始写了个深搜,过了30%的数据,也就是n<=10的那一段.... 然后看了题解发现这是个二分图的判断. 我们先举例子找到不能放进一个栈里的规律.设有数列[2,3,1,4] ...