Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.
Return all such possible sentences.
For example, given
s = "catsanddog"
,
dict = ["cat", "cats", "and", "sand", "dog"]
.
A solution is ["cats and dog", "cat sand dog"]
.
Subscribe to see which companies asked this question
题目链接:https://leetcode.com/problems/word-break-ii/
题目分析:用一个dp数组存储待分词字符串中以第i个字符结尾的所有可能单词的集合,比如dp[3] = {"cat"},dp[7] = {"and", "sand"}。。。然后DFS时枚举即可
public class Solution {
void DFS(int pos, List<String>[] dp, List<String> ans, List<String> tmp) {
if (pos == 0) {
StringBuilder save = new StringBuilder();
save.append(tmp.get(tmp.size() - 1));
for (int i = tmp.size() - 2; i >= 0; i --) {
save.append(" ");
save.append(tmp.get(i));
}
ans.add(save.toString());
return;
}
for (String word: dp[pos]) {
tmp.add(word);
DFS(pos - word.length(), dp, ans, tmp);
tmp.remove(tmp.size() - 1);
}
}
public List<String> wordBreak(String s, Set<String> wordDict) {
List<String> ans = new ArrayList<>();
int len = s.length();
List<String>[] dp = new ArrayList[len + 1];
dp[0] = new ArrayList<>();
for (int st = 0; st < len; st ++) {
if (dp[st] != null) {
for (String word: wordDict) {
int ed = st + word.length();
if (ed <= len) {
if (s.substring(st, ed).equals(word) == true) {
if (dp[ed] == null) {
dp[ed] = new ArrayList<>();
}
dp[ed].add(word);
}
}
}
}
}
if (dp[len] == null) {
return ans;
}
List<String> tmp = new ArrayList<>();
DFS(len, dp, ans, tmp);
return ans;
}
}