139. 单词拆分
暴力法:
https://leetcode-cn.com/problems/word-break/solution/zi-fu-chuan-sou-suo-wen-ti-bfshe-dfshui-shi-bi-jia/ 大神的题解抄袭一遍
https://leetcode-cn.com/problems/word-break/solution/shou-hui-tu-jie-san-chong-fang-fa-dfs-bfs-dong-tai/ 大神画图讲解
大神不要怪我偷个图,
广搜就是层序,
public boolean wordBreak(String s, List<String> wordDict) {
if (s == null || s.length() == 0 || wordDict == null || wordDict.size() == 0) {
return false;
}
//用于剪枝,保存已经不能组成的字符串
Set<String> visited = new HashSet<>();
//层序遍历的队列
Queue<String> queue = new ArrayDeque<>();
//根是原字符
queue.add(s);
while (!queue.isEmpty()) {
String cur = queue.poll();
//把所有可以用字典中打头的剩余字符存起来,继续寻找
for (String word : wordDict) {
//当前字符是否可以用word中的字符打头
if (cur.indexOf(word) == 0) {
//剩余字符继续查找
String leftStr = cur.substring(word.length());
if (leftStr.equals("")) {
return true;
}
//保证已经寻找过的字符串不在寻找,这里存的都是无法组成的,如果能组成,就在第一次寻找的时候return true了
if (visited.contains(leftStr)) {
continue;
}
queue.add(leftStr);
visited.add(leftStr);
}
}
}
return false;
}
此题的深搜和递归及其相似
就是str如果可以以dic开头,就找剩下的是否可以以dic开头到最后
f(str)=word->dic+f(str - word)
Set<String> visited1 = new HashSet<>();
public boolean wordBreak1(String s, List<String> wordDict) {
if (s == null || s.length() == 0 || wordDict == null || wordDict.size() == 0) {
return false;
}
for (String word : wordDict) {
if (s.indexOf(word) == 0) {
if (s.equals(word)) {
return true;
}
if (visited1.contains(s.substring(word.length()))) {
continue;
}
visited1.add(s.substring(word.length()));
if (wordBreak1(s.substring(word.length()), wordDict)) {
return true;
}
}
}
return false;
}