这个题可以用dfs做,思路简单,但是也可以用dp做。
Dp的做法基于Word Break I
也很费空间,每次的结果都要存起来,以免后面要用。
存到最后一个结果的时候,那就是题目要返回的值,也就是多少种词的情况。
至于最后那个原封不动的word break I的代码,是为了一个超大的全是aaaaaaaaaa...aaaa的集合量身打造的。因为如果不能break,我们就不费事搞了,直接返回。
public List<String> wordBreak(String s, Set<String> dict) {
int n=s.length();
boolean[] dp=new boolean[n+1];
dp[0]=true;
List<List<String>> words = new ArrayList<List<String>>();
for (int i = 0; i <= n; i++)
words.add(new ArrayList<String>());
words.get(0).add("");
if(!wordBreakI(s,dict)) return new ArrayList<String>();
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
String temp=s.substring(j,i);
if(dp[j] && dict.contains(temp)){
dp[i]=true;
for (String str : words.get(j)) {
if (str.equals(""))
words.get(i).add(String.format("%s", temp));
else
words.get(i).add(String.format("%s %s", str, temp));
}
}
}
}
return words.get(n);
}
public boolean wordBreakI(String s, Set<String> dict) {
//dp
int n= s.length();
boolean[] dp=new boolean[n+1];
dp[0]=true;
for(int i=1;i<=n;i++){
for(int j=0;j<=i;j++){
if(dp[j] && dict.contains(s.substring(j,i))){
dp[i]=true;
}
}
}
return dp[n];
}