描述
给一字串s和单词的字典dict,在字串中增加空格来构建一个句子,并且所有单词都来自字典。
返回所有有可能的句子。
样例1
输入:"lintcode",["de","ding","co","code","lint"]
输出:["lint code", "lint co de"]
解释:
插入一个空格是"lint code",插入两个空格是 "lint co de"
样例 2:
输入:"a",[]
输出:[]
解释:字典为空
解题思路
使用记忆化搜索
源代码
public class Solution {
public ArrayList<String> wordBreak(String s, Set<String> dict) {
// Note: The Solution object is instantiated only once and is reused by each test case.
Map<String, ArrayList<String>> memo = new HashMap<String, ArrayList<String>>();
return wordBreakHelper(s, dict, memo);
}
public ArrayList<String> wordBreakHelper(String s,
Set<String> dict,
Map<String, ArrayList<String>> memo){
if (memo.containsKey(s)) {
return memo.get(s);
}
ArrayList<String> results = new ArrayList<String>();
if (s.length() == 0) {
return results;
}
if (dict.contains(s)) {
results.add(s);
}
for (int len = 1; len < s.length(); ++len){
String word = s.substring(0, len);
if (!dict.contains(word)) {
continue;
}
String suffix = s.substring(len);
ArrayList<String> segmentations = wordBreakHelper(suffix, dict, memo);
for (String segmentation: segmentations){
results.add(word + " " + segmentation);
}
}
memo.put(s, results);
return results;
}
}