题目链接
单词拆分 II
题目描述
注意点
- s 和 wordDict[i] 仅有小写英文字母组成
- wordDict 中所有字符串都 不同
- 词典中的同一个单词可能在分段中被重复使用多次
- 以任意顺序 返回所有这些可能的句子
解答思路
- 使用深度优先遍历+回溯解决本题,每一层从idx开始遍历s(第i层代表前面找到了i - 1个单词,正在寻找第i个单词),找到在wordDict中存在的单词并将其存储到sb中,如果当前组成的单词在wordDict中存在且已经遍历完s,说明满足题意,将其该组合添加到结果中
代码
class Solution {
public List<String> wordBreak(String s, List<String> wordDict) {
List<String> res = new ArrayList<>();
StringBuilder sb = new StringBuilder();
dfs(s, wordDict, 0, res, sb);
return res;
}
public void dfs(String s, List<String> wordDict, int idx, List<String> res, StringBuilder sb) {
StringBuilder tmp = new StringBuilder();
int start = sb.length();
for (int i = idx; i < s.length(); i++) {
tmp.append(s.charAt(i));
if (!wordDict.contains(tmp.toString())) {
continue;
}
sb.append(tmp);
if (i == s.length() - 1) {
res.add(sb.toString());
} else {
sb.append(" ");
dfs(s, wordDict, i + 1, res, sb);
sb.deleteCharAt(sb.length() - 1);
}
sb.delete(start, sb.length());
}
}
}
关键点
- 深度优先遍历的思想
- 在将满足题意的单词添加到sb后,要进行回溯,方便找到该层的其他单词
- 每个单词之间以空格分割