【LeetCode】139. Word Break 解题报告(Python & C++)
作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/
题目地址:https://leetcode.com/problems/unique-binary-search-trees/description/
题目描述
Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine if s can be segmented into a space-separated sequence of one or more dictionary words.
Note:
- The same word in the dictionary may be reused multiple times in the segmentation.
- You may assume the dictionary does not contain duplicate words.
Example 1:
Input: s = "leetcode", wordDict = ["leet", "code"]
Output: true
Explanation: Return true because "leetcode" can be segmented as "leet code".
Example 2:
Input: s = "applepenapple", wordDict = ["apple", "pen"]
Output: true
Explanation: Return true because "applepenapple" can be segmented as "apple pen apple".
Note that you are allowed to reuse a dictionary word.
Example 3:
Input: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
Output: false
题目大意
判断一个字符串能不能由给定的字典中的字符串拼接得到。
解题方法
正好又学习巩固了一下DP。感觉DP套路太多了,每道题都不一样,至少LC上是这样的,很难说总结出什么规律。
按照CodeGanker的路子来:
- 确定可以保存的信息
- 递推式(以及如何在递推中使用保存的信息)
- 确定起始条件
放到这个题说
S能拆成功的话,说明
s[0:k]能拆成功,然后 s[k:i]是一个在字典中的单词。
后者是一步check: s[k:i] in wordDict;
前者是需要记录的信息dp[k]表示可拆
然后从头撸一遍就行了
有的时候,一个题自己不明白,看了别人的答案还是不懂,但是看了运行的结果就行。
"leetcode"
[u'leet', u'code']
[True, False, False, False, False, False, False, False, False]
[True, False, False, False, True, False, False, False, False]
[True, False, False, False, True, False, False, False, True]
"leetcode"
[u'le', u'et', u'code']
[True, False, False, False, False, False, False, False, False]
[True, False, True, False, False, False, False, False, False]
[True, False, True, False, True, False, False, False, False]
[True, False, True, False, True, False, False, False, True]
"leetcode"
[u'l', u'ee', u't', u'co', u'd', u'e']
[True, False, False, False, False, False, False, False, False]
[True, True, False, False, False, False, False, False, False]
[True, True, True, False, False, False, False, False, False]
[True, True, True, True, False, False, False, False, False]
[True, True, True, True, False, False, False, False, False]
[True, True, True, True, True, False, False, False, False]
[True, True, True, True, True, False, True, False, False]
[True, True, True, True, True, False, True, True, False]
[True, True, True, True, True, False, True, True, True]
做DP的题目一定要明白定义的dp[i]到底是什么,这个题里面的dp[i]代表的是[0,i)符不符合word break。需要遍历的范围就是从0~N+1. dp[0]是空字符串,就是true.
其实这个题和416. Partition Equal Subset Sum很像的,都是两重循环,第一重循环判断每个位置的状态,内层循环判断这个状态能不能有前面的某个状态+一个符合题目要求的条件得到。
Python代码:
class Solution(object):
def wordBreak(self, s, wordDict):
"""
:type s: str
:type wordDict: List[str]
:rtype: bool
"""
print(s)
print(wordDict)
dp = [False] * (len(s) + 1)
dp[0] = True
print(dp)
for i in xrange(1, len(s) + 1):
for k in xrange(i):
if dp[k] and s[k:i] in wordDict:
dp[i] = True
print(dp)
return dp.pop()
这个题的C++代码如下:
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
const int N = s.size();
unordered_set<string> wordSet(wordDict.begin(), wordDict.end());
// dp[i] means s[0:i) is wordBreak or not.
vector<bool> dp(N + 1, false);
dp[0] = true;
// i in range [0, N)
for (int i = 0; i <= N; ++i) {
for (int j = 0; j < i; ++j) {
if (dp[j] && wordSet.count(s.substr(j, i - j))) {
dp[i] = true;
break;
}
}
}
return dp.back();
}
};
日期
2018 年 2 月 25 日
2018 年 12 月 18 日 —— 改革开放40周年
2019 年 1 月 10 日 —— 加油
【LeetCode】139. Word Break 解题报告(Python & C++)的更多相关文章
- 【LeetCode】Word Break 解题报告
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...
- [LeetCode] 139. Word Break 单词拆分
Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine ...
- leetcode 139. Word Break 、140. Word Break II
139. Word Break 字符串能否通过划分成词典中的一个或多个单词. 使用动态规划,dp[i]表示当前以第i个位置(在字符串中实际上是i-1)结尾的字符串能否划分成词典中的单词. j表示的是以 ...
- Leetcode#139 Word Break
原题地址 与Word Break II(参见这篇文章)相比,只需要判断是否可行,不需要构造解,简单一些. 依然是动态规划. 代码: bool wordBreak(string s, unordered ...
- LeetCode 139. Word Break单词拆分 (C++)
题目: Given a non-empty string s and a dictionary wordDict containing a list of non-emptywords, determ ...
- Java for LeetCode 139 Word Break
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...
- leetcode 139. Word Break ----- java
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...
- LeetCode #139. Word Break C#
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...
- [leetcode]139. Word Break单词能否拆分
Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine ...
随机推荐
- 11-String to Integer (atoi)
字符串转整型,更新之后的leetcode题,需考虑各种情况, 测试过标准库的atoi函数,当字符串越界返回的值是错的, 而该题要求越界时的返回边界值,更加严谨. Implement atoi to c ...
- kubernetes部署kube-scheduler服务
同样的分非认证授权和认证授权: 非认证授权: cat > /lib/systemd/system/kube-scheduler.service <<EOF [Unit] Descri ...
- 9 — springboot整合jdbc、druid、druid实现日志监控 — 更新完毕
1.整合jdbc.druid 1).导入依赖 <dependency> <groupId>org.springframework.boot</groupId> &l ...
- Shell 打印空行的行号
目录 Shell 打印空行的行号 题解 Shell 打印空行的行号 写一个 bash脚本以输出一个文本文件 nowcoder.txt中空行的行号,可能连续,从1开始 示例: 假设 nowcoder.t ...
- Spark(二)【sc.textfile的分区策略源码分析】
sparkcontext.textFile()返回的是HadoopRDD! 关于HadoopRDD的官方介绍,使用的是旧版的hadoop api ctrl+F12搜索 HadoopRDD的getPar ...
- Scala(八)【面向对象总结】
面向对象总结 面向对象 1.scala包 1.声明包 1.在文件第一行通过package 包名 2.package 包名{ .... } 第二种方法,包名只能在target目录才能看到 2.导入包 1 ...
- Hive(十二)【调优】
目录 1.Fetch抓取 2.本地模式 3.表的优化 3.1大小表join 3.2大表Join大表 3.3map join 3.4group By 3.5 count(distinct) 3.6笛卡尔 ...
- IPv6 私有地址
在互联网的地址架构中,专用网络是指遵守RFC 1918(IPV4)和RFC 4193(IPV6)规范,使用专用IP地址空间的网络.私有IP无法直接连接互联网,需要使用网络地址转换(Network Ad ...
- spring boot 配置属性值获取注解@Value和@ConfigurationProperties比较
功能比较 : @ConfigurationProperties @Value 映射赋值 批量注入配置文件中的属性 一个个指定 松散绑定(松散语法)① 支持 不支持 SpEL② 不支持 支持 ...
- Java学习1:图解Java内存分析详解(实例)
首先需要明白以下几点: 栈空间(stack),连续的存储空间,遵循后进先出的原则,用于存放局部变量. 堆空间(heap),不连续的空间,用于存放new出的对象,或者说是类的实例. 方法区(method ...