给定一个非空字符串 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"] 输出: []
根据单词拆分Ⅰ中生成的结果数组result再进行动态规划。在result中为true的位置,保存对应的单词,然后将所有为true位置处的单词加空格累加即可。
示例一得到的result为:
所以,思路和划分单词类似,扫描到true时,将前边的所有单词拼接就可以了。
代码:
class Solution {
public boolean[] wordBreakResult(String s, List<String> wordDict){
final int length = s.length();
boolean[] result = new boolean[length+1];
result[0] = true;
for (int i = 0; i <= length; i++){
for (int j = 0; j < i; j++){
if (result[j] && wordDict.contains(s.substring(j,i))){
result[i] = true;
}
}
}
return result;
}
public List<String> wordBreak(String s, List<String> wordDict) {
boolean[] result = wordBreakResult(s,wordDict);
final int length = result.length - 1;
//返回最终的结果
List<List<String>> temp = new ArrayList<>();
if (result[length]) {
for (int i = 0; i <= length; i++) {
List<String> strings = new ArrayList<>();
for (int j = 0; j < i; j++) {
if (result[j] && wordDict.contains(s.substring(j, i))) {
List<String> list = temp.get(j);
if (list.size() > 0) {
for (String string : list) {
String str = string + " " + s.substring(j, i);
if (!string.equals(s.substring(j, i))) {
if (i == length) {
strings.add(str.trim());
} else {
strings.add(str);
}
}
}
}
}
}
if (strings.size() > 0) {
temp.add(i, strings);
} else {
temp.add(Arrays.asList(""));
}
}
List<String> list = temp.get(temp.size() - 1);
if (list.size() == 1 && list.get(0).equals("")) {
return new ArrayList<>();
}
return list;
}else {
return new ArrayList<>();
}
}
}