【Word Break】cpp
题目:
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>& wordDict) {
const int n = s.size();
vector<vector<bool> > dp(n,vector<bool>(n,false));
for ( int i=n-; i>=; --i )
{
for ( int j=i; j<n; ++j )
{
for ( int k=i; k<=j; ++k )
{
if ( k==j && wordDict.find(s.substr(i,j-i+))!=wordDict.end() )
{
dp[i][j]=true;
}
else
{
dp[i][j] = dp[i][k] && dp[k+][j];
if (dp[i][j]) break;
}
}
}
}
return dp[][n-];
}
};
tips:
用了一个二维dp的思路。
dp[i][j]表示s[i]到s[j]是否能被dict表示。
dp的顺序是从后往前走,相当于是从最下往上dp上三角阵。
求递推项dp[i][j]用一个循环遍历:dp[i][k] dp[k+1][j] ( i <= k <= j )如果能找到一个使得dp[i][j]为true,则跳出。
这里有一个corner case就是k==j的时候,dp[j+1][j]没有意义;因此特殊处理一下这种case,直接查找dict中是否有s[i:j]。
完成之后,在思考这道题是否可以用滚动数组来做?这样空间复杂度就降低为了O(n)
================================================
这个并不是滚动数组,就是一个一维DP,如下。
class Solution {
public:
bool wordBreak(string s, unordered_set<string>& wordDict) {
const int n = s.size();
vector<bool> dp(n+, false);
dp[] = true;
for ( int i=; i<=n; ++i )
{
for ( int j=; j<i; ++j )
{
if ( dp[j] && wordDict.find(s.substr(j,i-j))!=wordDict.end() )
{
dp[i] = true;
break;
}
}
}
return dp[n];
}
};
tips:
1. 空间复杂度由O(n²)降低到了O(n)
2. 代码更简洁了
并不是滚动数组,就是一维的DP,只不过dp[i]的取值要由dp[0:i-1]所有历史过程来决定。
===============================================
第二次过这道题,一开始没思路,后来强迫自己想出来了一维DP的解法,最后写了出来。
class Solution {
public:
bool wordBreak(string s, unordered_set<string>& wordDict) {
bool dp[s.size()+];
fill_n(&dp[], s.size()+, false);
dp[] = true;
for ( int i=; i<=s.size(); ++i )
{
if ( wordDict.find(s.substr(,i))!=wordDict.end() )
{
dp[i] = true;
continue;
}
for ( int j=i-; j>; --j )
{
if ( dp[j] && wordDict.find(s.substr(j,i-j))!=wordDict.end() )
{
dp[i] = true;
break;
}
}
}
return dp[s.size()];
}
};
【Word Break】cpp的更多相关文章
- 【Word Search】cpp
题目: Given a 2D board and a word, find if the word exists in the grid. The word can be constructed fr ...
- 【word ladder】cpp
题目: Given two words (beginWord and endWord), and a dictionary, find the length of shortest transform ...
- 【Word Break II】cpp
题目: Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where e ...
- 【word xml】将word转化为xml格式后,如何在xml中卫word添加分页符
1.首先在xml中找到我们需要添加分页符的位置 例如:我需要在这个第一部分上面添加一个分页符 2.找到这个[第一部分]这个位置之后,开始往上找,找到对应的位置 3.在</w:pPr>下方添 ...
- hdu 4739【位运算】.cpp
题意: 给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形.. 问最多可以拿走多少个正方形.. 思路: 先找出可以组成正方形的地雷组合cnt个.. 然后 ...
- 【Implement strStr() 】cpp
题目: Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if ne ...
- Hdu 4734 【数位DP】.cpp
题意: 我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字. 题目给出a,b,求出0~ ...
- POJ 1018 【枚举+剪枝】.cpp
题意: 给出n个工厂的产品参数带宽b和价格p,在这n个工厂里分别选1件产品共n件,使B/P最小,其中B表示n件产品中最小的b值,P表示n件产品p值的和. 输入 iCase n 表示iCase个样例n个 ...
- 【Text Justification】cpp
题目: Given an array of words and a length L, format the text such that each line has exactly L charac ...
随机推荐
- ArcGIS 从FileGDB中导出数据异常 000732
错误代码:000732 产生原因:文件夹命名时起名为“xxx.gdb”,造成是系统识别异常.
- zabbix文档3.4-7配置
zabbix文档3.4-7配置 1 主机和主机组 典型的Zabbix主机是您希望监视的设备(服务器,工作站,交换机等). 创建主机是Zabbix中首个监控任务之一.例如,如果要监视服务器"x ...
- yum安装软件并保留下载的软件
使用yum插件downloadonly下载安装软件需要的依赖包并保留到指定的文件 安装yum-downloadonly或 yum-plugin-downloadonly 软件包. yum instal ...
- HDU2433 最短路 + 剪枝优化
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2433 ,最短路(SPFA或优化过的Dijstra) + 剪枝优化 这道题关键还是在几个剪枝上面,没有剪 ...
- Ajax的open方法
Ajax的open()方法有3个参数:1.method:2.url:3.boolean: 参数1有get和post两个取值 参数2是表单的action属性值 参数3:boolean的取值 当该bool ...
- IOS 图片剪切(封装数据)
封装 :生成头像(UIImage (NJ).h / .m @interface UIImage (NJ) /** * 生成头像 * * @param icon 头像图片名称 * @param bord ...
- python_48_Python3中字符编码与转码
python3默认是Unicode,不用声明# -*- coding:utf-8 -*-,如果声明则是utf-8 unicode='你好' print('utf-8:',unicode.encode( ...
- 如何让图片相对于上层DIV始终保持水平、垂直都居中
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Centos7之Nginx
1.安装 下载RPM: wget http://nginx.org/download/nginx-1.16.0.tar.gz 解压:tar -zxf nginx-1.16.0.tar.gz 安装: c ...
- 10分钟了解 react 引入的 Hooks
"大家好,我是谷阿莫,今天要将的是一个...",哈哈哈,看到这个题我就想到这个开头.最近react 官方在 2018 ReactConf 大会上宣布 React v16.7.0-a ...