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"]
.
dfs搜吧,记录的事情就交给回溯了。
可以利用前面的Word Break I 先判断一下是否可以切开,否则一个比较长的不能切的词是会TLE的。
ArrayList<Integer> arraylist;
int slen;
List<String> retlist;
public List<String> wordBreak(String s, Set<String> wordDict)
{
arraylist=new ArrayList<>();
slen=s.length();
retlist=new ArrayList<>();
if(slen==0)
{
retlist.add("");
return retlist;
}
if(CanwordBreak(s, wordDict))
dfs(0, s, wordDict);
return retlist;
}
private void dfs(int start,String s,Set<String> dic)
{
if(start==slen)
{
StringBuilder sb=new StringBuilder();
for(int i=1;i<arraylist.size();i++)
{
sb.append(s.substring(arraylist.get(i-1), arraylist.get(i)));
sb.append(' ');
}
sb.append(s.substring(arraylist.get(arraylist.size()-1),slen));
retlist.add(sb.toString());
}
for(int i=start+1;i<=slen;i++)
{
String subs=s.substring(start, i);
if(dic.contains(subs))
{
arraylist.add(start);
dfs(i, s, dic);
arraylist.remove(arraylist.size()-1);
}
}
}
public boolean CanwordBreak(String s, Set<String> dict)
{
boolean[] dp = new boolean[s.length() + 1];
dp[0] = true;
for (int i = 1; i <= s.length(); i++)
{
for (int j = 0; j < i; j++)
{
if (dp[j] && dict.contains(s.substring(j, i)))
{
dp[i] = true;
break;
}
}
}
return dp[s.length()];
}