给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。
说明:
分隔时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
示例 1:
输入:
s = “pineapplepenapple”
wordDict = [“apple”, “pen”, “applepen”, “pine”, “pineapple”]
输出:
[
“pine apple pen apple”,
“pineapple pen apple”,
“pine applepen apple”
]
与前一题相比,此题要求返回所有拆分情况,如果直接使用 DFS 递归去做会超时,因此应加入记忆,避免重复计算。使用一个HashMap记录每个字符串的拆分情况,比如上面示例,对于字符串"applepenapple",它在hashmap中对应一个List,里面存着 “apple pen apple”,"applepen apple"两个字符串,这样再次遇到"applepenapple"时,就可以直接返回它的分解而不需要再次计算。
class Solution {
public List<String> wordBreak(String s, List<String> wordDict) {
List<String> res = new ArrayList<String>();
if (s == null || s.equals(""))
return res;
HashMap<String,List<String>> map = new HashMap<String,List<String>>();
helper(s, wordDict, map);
return map.get(s);
}
private List<String> helper(String s, List<String> wordDict, HashMap<String,List<String>> map) {
if (map.containsKey(s)) {
return map.get(s);
}
if (s.equals(""))
return null;
List<String> all = new ArrayList<String>();
for (int i = 0; i < s.length(); i++) {
String temp = s.substring(0,i+1);
if (wordDict.contains(temp)) {
List<String> b = helper(s.substring(i+1), wordDict, map);
if (b == null) {
all.add(temp);
}else {
for (String str : b)
all.add(temp +" " + str);
}
}
}
map.put(s, all);
return all;
}
}