给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。
说明:
- 分隔时可以重复使用字典中的单词。
- 你可以假设字典中没有重复的单词。
示例 1:
输入: s = "catsanddog
" wordDict =["cat", "cats", "and", "sand", "dog"]
输出:[ "cats and dog", "cat sand dog" ]
示例 2:
输入: s = "pineapplepenapple" wordDict = ["apple", "pen", "applepen", "pine", "pineapple"] 输出: [ "pine apple pen apple", "pineapple pen apple", "pine applepen apple" ] 解释: 注意你可以重复使用字典中的单词。
示例 3:
输入: s = "catsandog" wordDict = ["cats", "dog", "sand", "and", "cat"] 输出: []
利用了139的索引
class Solution {
public List<String> wordBreak(String s, List<String> wordDict) {
int sLength = s.length();
if(s == null || sLength < 1 || wordDict == null || wordDict.size() < 1){
return new ArrayList<>();
}
List<Integer> arrayIndex = new ArrayList<>();
//默认false
boolean[] b = new boolean[sLength];
for(int i=1;i<=sLength;i++){
for(int j=0;j<i;j++){
if(j==0){
if(wordDict.contains(s.substring(j,i))){
b[i-1] = true;
arrayIndex.add(i-1);
break;
}
}
else if(b[j-1]&&wordDict.contains(s.substring(j,i))){
b[i-1] = true;
arrayIndex.add(i-1);
}
}
}
if(!b[sLength-1]){
return new ArrayList<>();
}
Set<String> set = new HashSet<String>();
List<String> temp = new ArrayList<String>();
rec(s, wordDict, arrayIndex, set, temp, arrayIndex.size()-1);
System.out.println(set);
List<String> ret = new ArrayList<String>(set);
return ret;
}
public void rec(String s, List<String> wordDict, List<Integer> arrayIndex, Set<String> ret, List<String> temp, int lastIndex){
if(lastIndex<0){
StringBuilder sb = new StringBuilder();
for(int i=temp.size()-1;i>=0;i--){
sb.append(temp.get(i));
if(i != 0) {
sb.append(" ");
}
}
if(sb!=null){
ret.add(sb.toString());
//System.out.println(ret);
//System.out.println("================");
}
return;
}
int fixedValue = lastIndex;
int fixedIndex = arrayIndex.get(fixedValue);
int index;
while(lastIndex>=0){
index = arrayIndex.get(lastIndex);
if(lastIndex==fixedValue){
if(wordDict.contains(s.substring(0,index+1))){
temp.add(s.substring(0,index+1));
//System.out.println(s.substring(0,index+1));
rec(s,wordDict,arrayIndex,ret,temp,-1);
temp.remove(temp.size()-1);
}
}
else{
if(wordDict.contains(s.substring(index+1,fixedIndex+1))){
temp.add(s.substring(index+1,fixedIndex+1));
//System.out.println(s.substring(index+1,fixedIndex+1));
rec(s,wordDict,arrayIndex,ret,temp,lastIndex);
temp.remove(temp.size()-1);
}
}
lastIndex--;
}
}
}