LeetCode - Word Break II
2015-04-10 23:53
513 查看
https://leetcode.com/problems/word-break-ii/
Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.
Return all such possible sentences.
For example, given
s =
dict =
A solution is
这道题一开始一看该用递归做,但是递归是过不了的,因为超时。可以看到,在递归的话,每次都要从当前字符开始,一直到结束,检查substring是否在dict中,中间有许多重复的检查。因为,下面用的DP方法就是在一开始把所有的检查都完成,避免重复检查,并且适当剪枝。
从这道题可以看到,避免重复计算和找到适当的剪枝方法非常重要!
Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.
Return all such possible sentences.
For example, given
s =
"catsanddog",
dict =
["cat", "cats", "and", "sand", "dog"].
A solution is
["cats and dog", "cat sand dog"].
这道题一开始一看该用递归做,但是递归是过不了的,因为超时。可以看到,在递归的话,每次都要从当前字符开始,一直到结束,检查substring是否在dict中,中间有许多重复的检查。因为,下面用的DP方法就是在一开始把所有的检查都完成,避免重复检查,并且适当剪枝。
public class Solution { public List<String> wordBreak(String s, Set<String> dict) { List<String> dp[] = new LinkedList[s.length()+1]; dp[0] = new LinkedList<String>(); for(int i=0; i<s.length(); i++){ if(dp[i]==null) continue; //剪枝,当前字符前面的字符串不能用dict中字符串中组合成,所以从当前字符开始的不用检查了 for(String word:dict){ int len = word.length(); int end = i+len; if(end > s.length()) continue; if(s.substring(i, end).equals(word)){ if(dp[end]==null) dp[end] = new LinkedList<String>(); dp[end].add(word); } } } List<String> result = new ArrayList<String>(); if(dp[s.length()]==null) return result; ArrayList<String> tmp = new ArrayList<String>(); dfs(dp, result, tmp, s.length()); return result; } public void dfs(List<String>[] dp, List<String> result, ArrayList<String> tmp, int end){ if(end<=0){ StringBuilder sb = new StringBuilder(); for(int i=tmp.size()-1; i>=0; i--){ sb.append(tmp.get(i)); if(i!=0) sb.append(' '); } result.add(sb.toString()); return; } for(String word: dp[end]){ tmp.add(word); dfs(dp, result, tmp, end-word.length()); tmp.remove(tmp.size()-1); } } }
从这道题可以看到,避免重复计算和找到适当的剪枝方法非常重要!
相关文章推荐
- LeetCode_DP_Word Break II
- LeetCode: Word Break II [140]
- Leetcode Word Break II
- Leetcode: Word Break II
- [leetcode]Word Break II
- [LeetCode] WordBreak II, Solution
- LeetCode | Word Break II
- LeetCode_Word Break II
- [LeetCode] Word Break II
- LeetCode | Word Break II
- [LeetCode] Word Break II
- [leetcode]Word Break II @ Python
- [LeetCode] Word Break II
- LeetCode ||& Word Break && Word Break II(转)——动态规划
- Leetcode140:Word Break II
- leetcode — word-break-ii
- LeetCode之“动态规划”:Word Break && Word Break II
- [Leetcode] Word Break、Word BreakII
- leetcode做题总结,回溯法(N-Queens, N-QueensII,Combination SumI&II,wordbreak II, SubsetsI&II)
- LeetCode: Word Break II 解题报告