Leetcode(140) Word Break II

Description

Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, add spaces in s to construct a sentence where each word is a valid dictionary word. Return all such possible sentences.

Note:

  • The same word in the dictionary may be reused multiple times in the segmentation.
  • You may assume the dictionary does not contain duplicate words.

Example 1:

1
2
3
4
5
6
7
8
Input:
s = "catsanddog"
wordDict = ["cat", "cats", "and", "sand", "dog"]
Output:
[
"cats and dog",
"cat sand dog"
]

Example 2:

1
2
3
4
5
6
7
8
9
10
Input:
s = "pineapplepenapple"
wordDict = ["apple", "pen", "applepen", "pine", "pineapple"]
Output:
[
"pine apple pen apple",
"pineapple pen apple",
"pine applepen apple"
]
Explanation: Note that you are allowed to reuse a dictionary word.

Example 3:

1
2
3
4
5
Input:
s = "catsandog"
wordDict = ["cats", "dog", "sand", "and", "cat"]
Output:
[]

解法

最开始采用暴力DFS的方法,果断超时了,这个时候考虑剪枝,用dp数组计算位置i是否为可分位置,添加判断即可通过。

具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Solution {
List<String> res = new ArrayList<>();

public List<String> wordBreak(String s, List<String> wordDict) {
List<String> tmpres = new ArrayList<>();
boolean dp[] = new boolean[s.length() + 1];
for (int i = 0; i < s.length() + 1; i++) {
dp[i] = true;
}
DFShelper(s, 0, s.length(), wordDict, tmpres, dp);
return res;
}

boolean DFShelper(String s, int start, int end, List<String> wordDict, List<String> tmpres, boolean[] dp) {
if (start == end) {
String resstr = "";
for (int i = 0; i < tmpres.size() - 1; i++) {
resstr += (tmpres.get(i) + " ");
}
resstr += tmpres.get(tmpres.size() - 1);
res.add(resstr);
return true;
}
boolean ret = false;
for (int div = start + 1; div <= end; div++) {
if (wordDict.contains(s.substring(start, div)) && dp[div]) {
tmpres.add(s.substring(start, div));
if(DFShelper(s, div, end, wordDict, tmpres, dp)){
ret = true;
}
else{
dp[div] = false;
}
tmpres.remove(tmpres.size() - 1);
}
}
return ret;
}
}