题目描述:
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"]
.
题目分析:
题目要求将字符串按字典分割的所有可能单词组合输出,显然在I的基础上加深难度,I只要求判断能否分割。
首先,可以用一个2维数组记录单词的分割字符串其实位置和结束位置,T[i][j]表示S.substring(i,j+1)是字典里的单词,这样两层循环可以为T[][]赋值。
利用T[][]数组就可以用DFS输出单词组合了:若T[i][j]为真,则S.substring(i,j+1)可以分割,那么继续看以i为分割点,递归查找从i-1到0与分割点i组成的字符串的分割组合,直到i=0则是一个字符串的分割组合完成。
public ArrayList<String> wordBreak(String s, Set<String> dict) {
ArrayList<String> arrayList=new ArrayList<String>();
if(s==null||s.length()<=0)
return arrayList;
boolean T[][]=new boolean[s.length()][s.length()];
ifdict(T,s,dict);
String subString="";
dfs(T.length-1,s,subString,T,arrayList);
return arrayList;
}
public void dfs(int j,String s,String subString,boolean T[][],ArrayList<String> arrayList){
for(int i=j;i>=0;i--){
if(T[i][j]){
String subString1=s.substring(i, j+1)+" "+subString;
if(i==0){
arrayList.add(subString1.trim());
}else{
dfs(i-1,s,subString1,T,arrayList);
}
}
}
}
public void ifdict(boolean T[][],String s, Set<String> dict){
for(int i=s.length();i>0;i--)
for(int j=i-1;j>=0;j--){
if(dict.contains(s.substring(j,i))){
T[j][i-1]=true;
}
}
}