【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 ...
随机推荐
- 57-Palindrome Linked List
Palindrome Linked List My Submissions QuestionEditorial Solution Total Accepted: 46990 Total Submiss ...
- 日常Java 2021/10/1
正则表达式 \cx匹配由x指明的控制字符.例如,lcM匹配一个Control-M或回车符.x的值必须为A-Z或a-z之一.否则,将c视为一个原义的'℃'字符.\f匹配--个换页符.等价于\xOc和\c ...
- UBI 文件系统之分区挂载
Linux 系统中有关mtd和ubi的接口:(1) cat /proc/mtd:可以看到当前系统的各个mtd情况,(2) cat /proc/partitions: 分区信息,有上面的类似(3) ca ...
- 零基础学习java------day11------常用API---Object、Scanner、String、StringBufer/StringBuilder
API概述 API(application Programming Interface, 应用程序编程接口),是一些预先定义的函数.目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力, ...
- mybatis-插件开发
在Executor.StatementHandler.parameterHandler.resultSetHandler创建的时候都有一步这样的操作xxxHandler=interceptorChai ...
- 实现将rsyslog将日志记录与MySQL中
准备两个节点 node3: rsyslog node2: 数据库 准备相应的包 [root@node3 php-fpm.d]#yum install rsyslog-mysql 将数据拷贝到数据 ...
- c3p0的使用步骤
//1.导入c3p0的连个包,和mysql的驱动包//2.配置c3p0.xml的配置文件 <c3p0-config> <!-- 使用默认的配置读取连接池对象 --> <d ...
- 通过DT10获取程序执行过程中的实时覆盖率
DT10是新一代的动态测试工具,可以长时间跟踪记录目标程序执行情况,获取目标程序动态执行数据,帮助进行难于重现的Bug错误分析,覆盖率检测,性能测试,变量跟踪等等功能. 系统测试覆盖率,通常是用于判断 ...
- Linux centos7 安装.net 环境
其实在linux 下安装.net 环境并不复杂,但最近遇到的服务器没有外网,比较坑很多依赖都没有,记录下这次的安装过程. 一开始以为是服务器没有外网,后来发现是服务器没有配置dns,于是配置dns 第 ...
- 设计风格之REST
一.简介 REST简介 REST 是英文 representational state transfer(表象性状态转变)或者表述性状态转 移;Rest 是 web 服务的一种架构风格;使用 HTTP ...