一开始的错误答案与错误思路,幻想直接遍历得出答案:

 class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
for(int i;i<s.size();i++){
int step=;
for(int j;j<wordDict.size();j++){
if(s.substr(i,wordDict[j].size())==wordDict[j]){
step=wordDict[j].size();break;
}
}
if(step==) return false;
i+=step;
}
return true;
}
};

这种做法其实方向比较对,但是离正确答案还差一步,这里的step的更新是唯一的,而现实的情况可能同时满足几种不同的step,所以该程序可以通过测试用例"leetcode"
["leet","code"],但是不能通过"cars" ["car","ca","rs"]。所以我们需要想办法吧所有的step下的情况都存起来以供后面查找。但由于这样往后推是树状发散的,结果可能很多;

现在采用dp数组,如果前i个字母可以被拆分,则dp[i]==true否则dp[i]==false,然后令i++,对i+1的验证则是从j=i-maxlenth开始搜索(maxlenth为字典最长的单词长度),如果dp[j]==true且后面的j+1到i+1字典中有,说明i+1可被拆分,dp[i]==true;依次类推,代码如下:

 class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
vector<bool> dp(s.size()+,false);
dp[]=true;
unordered_set<string> m(wordDict.begin(),wordDict.end());
//获取最大wordDict的长度
int maxlen=;
for(int i=;i<wordDict.size();i++){
//maxlen=maxlen>wordDict[i].size()? maxlen : wordDict[i].size();
if(maxlen<wordDict[i].size()) maxlen=wordDict[i].size();
}
//遍历s,依次找到前i个字母能否被partition
for(int i=;i<=s.size();++i){
for(int j=max(i-maxlen,);j<i;++j){
//假如前j个字母能被拆分,而第j到第i个字母字典恰好又有,dp[i]为正确
if(dp[j]&& m.find(s.substr(j,i-j))!=m.end()){
dp[i]=true;break;
}
}
}
return dp[s.size()];
}
};

leetcode 139 单词拆分(word break)的更多相关文章

  1. LeetCode 139. 单词拆分(Word Break)

    139. 单词拆分 139. Word Break

  2. Java实现 LeetCode 139 单词拆分

    139. 单词拆分 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词. 你可 ...

  3. Leetcode 139.单词拆分

    单词拆分 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词. 你可以假设字典 ...

  4. [Swift]LeetCode139. 单词拆分 | Word Break

    Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine ...

  5. LeetCode——139. 单词拆分

    给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词. 你可以假设字典中没有重复 ...

  6. [LeetCode] 139. 单词拆分(DP)

    题目 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词. 你可以假设字典中没 ...

  7. Java实现LeetCode 139 单词拆分

    public boolean wordBreak(String s, List<String> wordDict) { if(s.length() == 0){ return false; ...

  8. [LeetCode] 140. 单词拆分 II

    题目链接 : https://leetcode-cn.com/problems/word-break-ii/ 题目描述: 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符 ...

  9. leetcode 140 单词拆分2 word break II

    单词拆分2,递归+dp, 需要使用递归,同时使用记忆化搜索保存下来结果,c++代码如下 class Solution { public: //定义一个子串和子串拆分(如果有的话)的映射 unorder ...

随机推荐

  1. vi编辑器中删除文件中所有字符

    在命令模式下,将光标移动到文档最上方(使用gg命令),然后输入dG,删除工作区内所有缓存数据. 如果想要删除某行文档以下的内容,将光标移动到文档相应行,然后输入dG即可.

  2. python、mysql三-3:完整性约束

    一 介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY ...

  3. AntisymmetricRNN: A Dynamical System View on Recurrent Neural Networks(解析)

    原文链接:https://arxiv.org/abs/1902.09689 发表在:ICLR 2019 ------------------------------------------------ ...

  4. poj3666/CF714E/hdu5256/BZOJ1367(???) Making the Grade[线性DP+离散化]

    给个$n<=2000$长度数列,可以把每个数改为另一个数代价是两数之差的绝对值.求把它改为单调不增or不减序列最小代价. 话说这题其实是一个结论题..找到结论应该就很好做了呢. 手玩的时候就有感 ...

  5. Spring MVC 文件上传简单示例(form、ajax方式 )

    1.Form Upload SpringMVC 中,文件的上传是通过 MultipartResolver 实现的,所以要实现上传,只要注册相应的 MultipartResolver 即可. Multi ...

  6. restful api 相关

    404:资源没有找到400:参数错误 200:Get获取成功201:Post创建成功202:Put更新成功 401:未授权403:当前的资源禁止 500:服务器的未知错误 错误码 错误信息 当前url ...

  7. TCP/IP网络编程系列之一(初级)

    概述 网络编程实际上就是编写程序使两台联网的计算机相互的交换数据.操作系统会提供名为“ 套接字 ”的部件.套接字是网络数据传输的软件设备,即使对网络数据传输原理不太熟悉也无关紧要.我们也能通过套接字完 ...

  8. 简单加密 DEncrypt

    /// <summary> /// Encrypt 的摘要说明. /// </summary> public class DEncrypt { /// <summary& ...

  9. C# image/byte[]/string/互转

    public Image ByteArrayToImage(byte[] iamgebytes) { MemoryStream ms = new MemoryStream(iamgebytes); I ...

  10. PHP大文件上传断点续传解决方案

    1.使用PHP的创始人 Rasmus Lerdorf 写的APC扩展模块来实现(http://pecl.php.net/package/apc) APC实现方法: 安装APC,参照官方文档安装,可以使 ...