您的位置:首页 > 其它

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 =
"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);
}
}
}


从这道题可以看到,避免重复计算和找到适当的剪枝方法非常重要!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: