leetcode 139 单词拆分(word break)
一开始的错误答案与错误思路,幻想直接遍历得出答案:
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)的更多相关文章
- LeetCode 139. 单词拆分(Word Break)
139. 单词拆分 139. Word Break
- Java实现 LeetCode 139 单词拆分
139. 单词拆分 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词. 你可 ...
- Leetcode 139.单词拆分
单词拆分 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词. 你可以假设字典 ...
- [Swift]LeetCode139. 单词拆分 | Word Break
Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine ...
- LeetCode——139. 单词拆分
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词. 你可以假设字典中没有重复 ...
- [LeetCode] 139. 单词拆分(DP)
题目 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词. 你可以假设字典中没 ...
- Java实现LeetCode 139 单词拆分
public boolean wordBreak(String s, List<String> wordDict) { if(s.length() == 0){ return false; ...
- [LeetCode] 140. 单词拆分 II
题目链接 : https://leetcode-cn.com/problems/word-break-ii/ 题目描述: 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符 ...
- leetcode 140 单词拆分2 word break II
单词拆分2,递归+dp, 需要使用递归,同时使用记忆化搜索保存下来结果,c++代码如下 class Solution { public: //定义一个子串和子串拆分(如果有的话)的映射 unorder ...
随机推荐
- Clang调试CUDA代码
Clang调试CUDA代码全过程 有空再进行编辑,最近有点忙,抱歉 使用的llvm4.0+Clang4.0的版本,依据的是上次发的llvm4.0和clang4.0源码安装的教程https://www. ...
- monkey基础使用教程,如何安装和monkey分析日志
1.概念 什么是monkey,monkey的作用是什么? Monkey是Android自身提供的,可以通过adb shell模拟用户行为,发送一些伪随机用户事件到目标设备上. Monkey和它的直接意 ...
- io:轻松地创建缓存
介绍 io模块是python中专门用来进行流处理的模块 StringIO 提供字符串形式的缓存,可以不断地往里面写入数据,最后一次性读出 import io # 创建相应的缓存 buf = io.St ...
- traceback:让你更加灵活地处理python的异常
异常 异常在python中是屡见不鲜了,程序在执行到某一行代码时,发现有问题,比如数组索引越界,变量没有定义啊等等,此时就会抛出异常 捕获异常 在python,一般都是使用try···except来对 ...
- windows文本操作字符命令含义
r 打开只读文件,该文件必须存在. r+ 打开可读写的文件,该文件必须存在. rb+ 读写打开一个二进制文件,只允许读写数据. rt+ 读写打开一个文本文件,允许读和写. w 打开只写文件,若文件存在 ...
- CRM项目讲解和django知识点回顾
今天想把之前写的CRM项目梳理下,顺便回顾一下djiango的部分重要知识. 1.登录页面(包含简单验证码) 首先来看下CRM的登录页面,样式啥的不重要,大家可以去jquery ui的网站上或者其他地 ...
- qt打印输出到控制台
创建工程的时候是QT Console Application 1.项目->run->Run in terminal 2.pro文件中添加 CONFIG +=console thread ...
- qt5--定时器
定时器方式一:----定时器事件 需要 #include <QTimerEvent> #include "win.h" #include <QDebug& ...
- 【WinForm-无边框窗体】实现Panel移动窗体,没有边框的窗体
没有边框的窗体怎么移动?其实方法有很多,下面介绍一种用控件来移动窗体,Panel或PictureBox都可.主要设置控件的MouseDowm和MouseLeave事件. 第一步:窗体设计 窗体最上面是 ...
- JS如何设置和获取盒模型对应的宽和高
㈠方式一:通过DOM节点的 style 样式获取 dom.style.width/height 只能获取使用内联样式的元素的宽和高. <!DOCTYPE html> <html ...