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"]
.
NP-problem again, Time: depend on size of result
Solution#1: brute force of Recursive-loop, The appraoch is pretty
similar with N-Queens problem
Maintain a result List, traverse all the sub-String list
Calling recursion iff dict contain currently String(word)
public static ArrayList<String> wordBreak(String s, Set<String> dict) {
ArrayList<String> res=new ArrayList<String>();
if(s==null || s.length()==0) return res;
//We need to determine the word is valid or not before break in order to AC in LeetCode
if(wordBreakCheck(s,dict)){
helper(s,dict,0,"",res);
return res;
}else{
return res;
}
}
private static void helper(String s, Set<String> dict, int index, String curData, ArrayList<String> res){
int len=s.length();
//completed a valid word break case
if(index>=len){
res.add(curData);
return;
}
StringBuilder str=new StringBuilder();
for(int i=index;i<len;i++){
str.append(s.charAt(i));
if(dict.contains(str.toString())){
String newCurData=curData.length()>0?curData+" "+str.toString():str.toString();
//recursive call: increasing index by i+1 && update curData with newCurData
helper(s,dict,i+1,newCurData,res);
}
}
}
public static boolean wordBreakCheck(String s, Set<String> dict) {
if(s==null || s.length()==0) return true;
int len=s.length();
boolean res[]=new boolean[len+1];
//initial res[0]
res[0]=true;
for(int i=0;i<len;i++){
StringBuilder tempStr=new StringBuilder(s.substring(0,i+1));
for(int j=0;j<=i;j++){
if(res[j] && dict.contains(tempStr.toString())){
res[i+1]=true;
break;
}
tempStr.deleteCharAt(0);
}
}
return res[len];
}