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

 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. pytorch简单框架

    网络搭建: mynn.py: import torchfrom torch import nnclass mynn(nn.Module): def __init__(self): super(mynn ...

  2. Linux版本显示和区别32位还是64位系统

    查看已经安装的Linux版本信息 1.cat /etc/issue 查看版本 [root@master master]# cat /etc/issue \S Kernel \r on an \m 2. ...

  3. LCD 原理和移植总结【转】

    转自:http://blog.chinaunix.net/uid-22915173-id-329617.html Framebuffer:是linux的framebuffer驱动在内存开辟的一块显存, ...

  4. 02-springmvc分布式项目dataService项目配置

    spring总文件 文件名:applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> ...

  5. javascript模板字符串(反引号)

    模板字面量 是允许嵌入表达式的字符串字面量. 你可以使用多行字符串和字符串插值功能.它们在ES2015规范的先前版本中被称为“模板字符串”. 语法 `string text`​`string text ...

  6. 498. Diagonal Traverse

    题目思路 题目来源 C++实现 class Solution { public: vector<int> findDiagonalOrder(vector<vector<int ...

  7. noi.ac NA531 【神树和物品】

    今日成就:本来以为过了这题,然后被mcfx发现写假并针对地造了一组hack数据之后FST了. 复杂度什么的咱也不会证,咱也不会卡,被hack之后只能FST. 是个决策单调性sb题,但是由于太菜不怎么会 ...

  8. nginx部署网站step by step

    安装后,修改nginx.conf,在httpd{}中添加 include /nginx/vhosts/*.conf; 如果没有vhosts就新建一个文件夹 *.conf是一种正则表达式用法,表示纳入一 ...

  9. thinkphp5.11 关于数据库连接的配置

    config.php <?php// +----------------------------------------------------------------------// | Th ...

  10. js 多个三目运算符优先级

    读JS代码遇到一段看不懂运算优先级的代码,如下 var BrowserSys = {}; var ua = navigator.userAgent.toLowerCase(); var s; (s = ...