LeetCode_DP_Word Break II
来源:互联网 发布:php验证码源码 编辑:程序博客网 时间:2024/05/01 15:46
LeetCode_Word Break II
一、题目描述:
二、解决思路:
题目要求我们要在原字符串中加空格,使得隔开的每个词都是词典中的词。
所以我们大可以按顺序扫描每个字符,但是然后当碰到是词典中的词,就加个空格,但是要求返回的结果按题目的提醒是个List,说明有很多分隔方式。
再细细想问题,我们发现第二个词能被成功分隔出来,是因为第一个词已经分出来了,依次类推;所以我们可以采用动态规划,设置初值dp[0] 是一个 List;递推式是 dp[n] = dp[n-1] && a[n] (a[n] = dict.contains(每次截断的字符串))。
这样,我们通过动态规划,就获得了字符串中每个字符索引处的单词。dp[10] = {“dog”}, dp[7]={“and”,”sand”}, dp[4]={“cats”}, dp[3]={“cat”}, dp[0]={},其他都是null。
最后我们要做的就是按顺序组合字符串,放到List中,返回。怎么组合呢?这就可以利用dfs递归。在我理解,可以把递归想象成一个栈,重要的是设置结束条件和在剔除栈顶元素。
三、Java代码:
public class Solution { public List<String> wordBreak(String s, Set<String> wordDict) { List<String>[] dp = new ArrayList[s.length()+1]; dp[0] = new ArrayList<String>();//设置初值 for(int end=1; end<=s.length(); end++) {//substring的endIndex for(int start=end-1; start>=0; start--) { String word = s.substring(start,end); if(dp[start] != null && wordDict.contains(word)) { //动态规划递推式 if(dp[end] == null) { dp[end] = new ArrayList<String>(); } dp[end].add(word); } } } List<String> result = new ArrayList<String>(); if(dp[s.length()] == null) return result; else { List<String> temp = new ArrayList<String>(); dsfStringList(dp,s.length(),result,temp); return result; } } private static void dsfStringList(List<String>[] dp, int end, List<String> res, List<String> temp) { if(end <= 0) { //递归结束条件 String s = temp.get(temp.size()-1); for(int i = temp.size()-2; i >= 0; i--) s += (" "+temp.get(i)); res.add(s); return; } for(String str : dp[end]) { temp.add(str); dsfStringList(dp, end-str.length(), res, temp); //递归式 temp.remove(temp.size()-1); } }}
希望与大家多多交流!
0 0
- LeetCode_DP_Word Break II
- Leetcode_DP_Word Break
- Word Break && Word Break II
- Word Break && Word Break II
- [leetcode]Word Break II
- Word Break II
- Word Break II
- LeetCode:Word Break II
- Word Break II
- Leetcode: Word Break II
- [LeetCode] Word Break II
- [LeetCode]Word Break II
- LeetCode | Word Break II
- Word Break II
- Word Break II
- [LeetCode] - Word Break II
- LeetCode - Word Break II
- Leetcode Word Break II
- Haproxy解析
- 状态压缩讲解
- netty的心跳检测实现
- 实模式和保护模式区别及寻址方式
- redis使用规范
- LeetCode_DP_Word Break II
- 妈妈去世了
- Jayspt加密外部属性
- python修饰器
- MySQL 分页查询性能分析
- JavaScript中的this代表什么?
- 去掉UUID的小横线,如果你觉得不爽的话,哈哈
- JNI Helloworld
- Python Foundation - part one