# 单词拆分 II

<p>给定一个<strong>非空</strong>字符串 <em>s</em> 和一个包含<strong>非空</strong>单词列表的字典 <em>wordDict</em>，在字符串中增加空格来构建一个句子，使得句子中所有的单词都在词典中。返回所有这些可能的句子。</p>

<p><strong>说明：</strong></p>

<ul>
	<li>分隔时可以重复使用字典中的单词。</li>
	<li>你可以假设字典中没有重复的单词。</li>
</ul>

<p><strong>示例 1：</strong></p>

<pre><strong>输入:
</strong>s = &quot;<code>catsanddog</code>&quot;
wordDict = <code>[&quot;cat&quot;, &quot;cats&quot;, &quot;and&quot;, &quot;sand&quot;, &quot;dog&quot;]</code>
<strong>输出:
</strong><code>[
&nbsp; &quot;cats and dog&quot;,
&nbsp; &quot;cat sand dog&quot;
]</code>
</pre>

<p><strong>示例 2：</strong></p>

<pre><strong>输入:
</strong>s = &quot;pineapplepenapple&quot;
wordDict = [&quot;apple&quot;, &quot;pen&quot;, &quot;applepen&quot;, &quot;pine&quot;, &quot;pineapple&quot;]
<strong>输出:
</strong>[
&nbsp; &quot;pine apple pen apple&quot;,
&nbsp; &quot;pineapple pen apple&quot;,
&nbsp; &quot;pine applepen apple&quot;
]
<strong>解释:</strong> 注意你可以重复使用字典中的单词。
</pre>

<p><strong>示例&nbsp;3：</strong></p>

<pre><strong>输入:
</strong>s = &quot;catsandog&quot;
wordDict = [&quot;cats&quot;, &quot;dog&quot;, &quot;sand&quot;, &quot;and&quot;, &quot;cat&quot;]
<strong>输出:
</strong>[]
</pre>


## template

```java
class Solution {
	public List<String> wordBreak(String s, List<String> wordDict) {

		List<String> res = new ArrayList<>();
		int max = 0, min = Integer.MAX_VALUE;
		Set<String> set = new HashSet<>();
		for (String word : wordDict) {
			set.add(word);
			max = Integer.max(max, word.length());
			min = Integer.min(min, word.length());
		}

		boolean f[] = new boolean[s.length() + 1];
		f[0] = true;
		for (int i = 1; i < s.length() + 1; i++) {
			for (int j = Math.max(i - max, 0); j <= i - min; j++) {
				if (f[j] && set.contains(s.substring(j, i))) {
					f[i] = true;
					break;
				}
			}
		}
		if (f[s.length()]) {
			dfs(s, res, new StringBuilder(), set, 0, max, min);
		}
		return res;
	}

	private void dfs(String s, List<String> res, StringBuilder sb, Set<String> set, int index, int max, int min) {
		if (index == s.length()) {
			sb.deleteCharAt(sb.length() - 1);
			res.add(sb.toString());
			return;
		}
		String str;
		int size;
		for (int i = index + min; i <= s.length() && i <= index + max; i++) {
			if (set.contains(str = s.substring(index, i))) {
				size = sb.length();
				sb.append(str).append(' ');
				dfs(s, res, sb, set, i, max, min);
				sb.delete(size, sb.length());
			}
		}
	}
}


```

## 答案

```java

```

## 选项

### A

```java

```

### B

```java

```

### C

```java

```