leetcode之Word-break
来源:互联网 发布:php cli模式 编辑:程序博客网 时间:2024/06/09 15:38
题目
Word-break
Given a string s and a dictionary of wordsdict, determine if s can be segmented into a space-separated sequence of one ormore dictionary words.
For example, given
s ="leetcode",
dict =["leet", "code"].
Return true because"leetcode"canbe segmented as"leet code".
思路:
如果一个单词存在一种分解方法,分解后每一块都在字典中,那必定满足这么一个条件:对于该单词的最后一个分割点,这个分割点到单词末尾所组成的字符串是一个单词,而这个分割点到单词开头所组成的字符串也是可分解的。所以只要验证满足这个条件,我们则可以确定这个较长的字符串也是可分解的。
所以我们用外层循环来控制待验证的字符串的长度,而用内层的循环来寻找这么一个分割点,可以把字符串分成一个单词和一个同样可分解的子字符串。同时,我们用数组记录下字符串长度递增时可分解的情况,以供之后使用,避免重复计算。
解法:
动态规划
首先我们要决定要存储什么历史信息以及用什么数据结构来存储信息。然后是最重要的递推式,就是如从存储的历史信息中得到当前步的结果。最后我们需要考虑的就是起始条件的值。
接下来我们套用上面的思路来解这道题。首先我们要存储的历史信息res[i]是表示到字符串s的第i个元素为止能不能用字典中的词来表示,我们需要一个长度为n的布尔数组来存储信息。然后假设我们现在拥有res[0,...,i-1]的结果,我们来获得res[i]的表达式。思路是对于每个以i为结尾的子串,看看他是不是在字典里面以及他之前的元素对应的res[j]是不是true,如果都成立,那么res[i]为true,写成式子是
时间复杂度:O(n^2)
空间复杂度:O(n)。
具体代码:
public boolean wordBreak(String s,Set<String> dict) {
if(s == null || s.length() == 0)
returntrue;
boolean[]res = new boolean[s.length() + 1];
res[0]= true;
for(int i = 0; i < s.length(); i++) {
StringBuilderstr = new StringBuilder(s.substring(0, i + 1));
for(int j = 0; j <= i; j++) {
if(res[j] && dict.contains(str.toString())) {
res[i+ 1] = true;
break;
}
str.deleteCharAt(0);
}
}
returnres[s.length()];
}
- leetcode之Word Break
- LeetCode 之 Word Break
- leetcode之Word Break
- leetcode之Word Break
- leetcode之Word Break
- leetcode之Word Break
- LeetCode之Word Break
- leetcode之Word-break
- leetcode之Word Break II
- leetcode之Word Break II
- LeetCode之Word Break II
- leetcode Word Break & Word Break ||
- Leetcode刷题之Word Break
- LeetCode OJ 之 Word Break (断词)
- Leetcode: Word Break
- [leetcode]Word Break
- [leetcode]Word Break II
- LeetCode:Word Break
- 【模板】【数论】gcd和exgcd
- struts2_2
- hibernate5常用jar包
- Leetcode89. Gray Code
- 二叉树的数据结构定义
- leetcode之Word-break
- Java基础[8]泛型程序设计
- swift_异常处理
- 数据结构实验之二叉树一:树的同构
- 渗透测试工具之SQLMap的详细使用方法
- jquery weui实现多tab异步滚动加载更多
- JAVA(0):java环境变量设置
- Java自动装箱、自动拆箱
- Qt Creator 使用笔记