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"].
这个题目和上一个很相似,但改成用List数组words保存符合的单词。如下图,再用深搜
的方法得到所有可能的组合。
public class Solution {
public List<String> wordBreak(String s, Set<String> wordDict) {
List<String>[] words=new ArrayList[s.length()+1];
words[0]=new ArrayList<String>();
for(int i=0;i<s.length();i++){
if(words[i]==null)continue;
for(String str:wordDict){
int len=str.length();
int start=i+len;
if(start>s.length())continue;
if(s.substring(i,start).equals(str)){
if(words[start]==null)
words[start]=new ArrayList<String>();
words[start].add(str);
}
}
}
List<String> result=new LinkedList<String>();
if(words[s.length()]==null)
return result;
List<String> tmp=new ArrayList<String>();
dfs(words,s.length(),result,tmp);
return result;
}
private void dfs(List<String>[] words,int end,List<String> result,List<String> tmp){
if(end<=0){
String path=tmp.get(tmp.size()-1);
for(int i=tmp.size()-2;i>=0;i--)
path+=" "+tmp.get(i);
result.add(path);
}
for(String str:words[end]){
tmp.add(str);
dfs(words,end-str.length(),result,tmp);
tmp.remove(tmp.size()-1);
}
}
}