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"]
.
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);
}
}
}
从这道题可以看到,避免重复计算和找到适当的剪枝方法非常重要!