140単語分割II
与えられた文字列s非空と非空の辞書のwordDictは文、すべての単語が辞書にあるような文を構築するために、文字列内のスペースを増やすために、単語のリストを含みます。これらすべての可能な文を返します。
説明:
分離時に辞書で単語を再利用することができます。
あなたは辞書に単語のない繰り返しが存在しないと仮定することができます。
例1:
入力:
S = "catsanddog"
wordDict = [ "CAT"、 "CATS"、 "および"、 "砂"、 "犬"]
出力:
[
"猫と犬"、
"サンドCAT犬"
]
実施例2:
入力:
S = "pineapplepenapple"
wordDict = [ "アップル"、 "PEN"、 "applepen"、 "パイン"、 "パイナップル"]
出力:
[
"パインアップルPENアップル"、
"パイナップルPENアップル"、
「パインapplepenアップル"
]
説明:注あなたが辞書に単語を再利用できること。
例3:
入力:
S = "catsandog"
wordDict = [ "CATS"、 "犬"、 "砂"、 "および"、 "CAT"]
出力:
[]
class Solution {
private Map<String, List<String>> cache = new HashMap<>();
public List<String> wordBreak(String s, List<String> wordDict) {
return dfs(s, wordDict,0);
}
private List<String> dfs(String s, List<String> wordDict, int offset){
if (offset == s.length()){
List<String> res = new ArrayList<>();
res.add("");
return res;
}
if (cache.containsKey(s.substring(offset))){
return cache.get(s.substring(offset));
}
List<String> res = new ArrayList<>();
for (String word : wordDict){
if (word.equals(s.substring(offset, Math.min(s.length(),offset + word.length())))){
List<String> next = dfs(s, wordDict, offset + word.length());
for (String str: next){
res.add((word + " "+ str).trim());
}
}
}
cache.put(s.substring(offset),res);
return res;
}
}