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 ...
随机推荐
- leepcode作业解析-5-15日
1.删除排序数组中的重复项 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外 ...
- Knockout v3.4.0 中文版教程-2-监控-通过监控创建视图模型(上)
2. 监控 1.通过监控创建视图模型 1. 监控 Knockout是基于以下三个核心特性: 监控和依赖跟踪 声明式绑定 模板 在本节,你将第一次了解这三个特性,在这之前,我们先来了解以下MVVM模式和 ...
- js--如何判别 null undefined
收集资料如下判断: 1.判断undefined: ? 1 2 3 4 var tmp = undefined; if (typeof(tmp) == "undefined"){ a ...
- 一、harbor部署之centos7的基本配置
1 最小安装centos7 ...安装省略... centos7最小化安装后没ifconfig命令,用 ip addr 命令查看网络信息. 2 配置网络 1.cd /etc/sysconfig/net ...
- Python第三方库之openpyxl(4)
Python第三方库之openpyxl(4) 2D柱状图 在柱状图中,值被绘制成水平条或竖列. 垂直.水平和堆叠柱状图. 注意:以下设置影响不同的图表类型 1.在垂直和水平条形图之间切换,分别设置为c ...
- centos 7 smplayer vlc播放器
centos7安装多媒体播放器SMPlayer 2017-03-13 21:37:14 分类: LINUX 转自:https://wiki.centos.org/TipsAndTricks/Multi ...
- [Kubernetes]深入解析Pod
Pod是Kubernetes项目的原子调度单位 为什么需要Pod? 容器是未来云计算系统中的进程,容器镜像就是这个系统里的".exe"安装包,那Kubernetes就是操作系统. ...
- DataTable排序
DataRow[] rows = dt.Select("", "name asc"); DataTable t = dt.Clone(); t.Clea ...
- css解析规则
1.因为css对空格不敏感,因此在每个样式后都要加一个分号,不然会把写在后面的样式当成一个整体来解析,直到遇到分号为止. 2.当遇见不认识的属性或值时,将忽略这个属性,继续解析后面的属性. 3.对于复 ...
- POJ 2096 (dp求期望)
A - Collecting Bugs Time Limit:10000MS Memory Limit:64000KB 64bit IO Format:%I64d & %I64 ...