题目:

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的更多相关文章

  1. 【Word Search】cpp

    题目: Given a 2D board and a word, find if the word exists in the grid. The word can be constructed fr ...

  2. 【word ladder】cpp

    题目: Given two words (beginWord and endWord), and a dictionary, find the length of shortest transform ...

  3. 【Word Break II】cpp

    题目: Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where e ...

  4. 【word xml】将word转化为xml格式后,如何在xml中卫word添加分页符

    1.首先在xml中找到我们需要添加分页符的位置 例如:我需要在这个第一部分上面添加一个分页符 2.找到这个[第一部分]这个位置之后,开始往上找,找到对应的位置 3.在</w:pPr>下方添 ...

  5. hdu 4739【位运算】.cpp

    题意: 给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形.. 问最多可以拿走多少个正方形.. 思路: 先找出可以组成正方形的地雷组合cnt个.. 然后 ...

  6. 【Implement strStr() 】cpp

    题目: Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if ne ...

  7. 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~ ...

  8. POJ 1018 【枚举+剪枝】.cpp

    题意: 给出n个工厂的产品参数带宽b和价格p,在这n个工厂里分别选1件产品共n件,使B/P最小,其中B表示n件产品中最小的b值,P表示n件产品p值的和. 输入 iCase n 表示iCase个样例n个 ...

  9. 【Text Justification】cpp

    题目: Given an array of words and a length L, format the text such that each line has exactly L charac ...

随机推荐

  1. app开发,H5+CSS3页面布局小tips

    1.inline-block使用后带来的间隔影响 2.竖线的处理 3.ssh公匙 4.星星组件的巧妙用法 5.api.js的$api对象与 安卓原生引擎的api对象,均相当于jQuery的$对象 6. ...

  2. <Android 基础(四)> RecyclerView

    介绍 RecyclerView是ListView的豪华增强版.它主要包含以下几处新的特性,如ViewHolder,ItemDecorator,LayoutManager,SmothScroller以及 ...

  3. javascript字符串格式化string.format

    String.prototype.format = function () { var values = arguments; return this.replace(/\{(\d+)\}/g, fu ...

  4. 数据字典的设计--3.首页添加删除表格(JS实现)

    页面效果: JS代码: 1.添加表格 function insertRows(){ //获取表格对象 var tb1 = $("#dictTbl"); var tempRow = ...

  5. centos升级3.10内核到4.4

    为了满足k8s对内核要求,默认Centos 7的内核为3.10建议升级到4.x内核 默认3.10内核升级为4.x内核 rpm -Uvh http://www.elrepo.org/elrepo-rel ...

  6. IOS UITabBarController(控制器)的子控制器

    UITabBarController的简单使用 ● UITabBarController的使用步骤 ➢ 初始化UITabBarController ➢ 设置UIWindow的rootViewContr ...

  7. Oracle开发›如何取出每个分组的第一条记

    <ignore_js_op> 截屏图片 (2).jpg (43.34 KB, 下载次数: 21) 下载附件 2012-11-7 12:36 上传   如何取出每个分组的第一条记录(黄色背景 ...

  8. vuejs里面v-if,v-show和v-for

    <div id='root'> <div v-if='show'>helle world</div> <button @click='handleClick' ...

  9. OneNote- 面经

  10. 使用U盘引导安装CentOS

    一.制作linux引导盘 1. 格式化U盘:格式成FAT32格式 2. 安装syslinux https://www.kernel.org/pub/linux/utils/boot/syslinux/ ...