mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-11 13:00:22 +08:00
更改了回溯+记忆的逻辑
经过提交验证,其实memo[startIndex] = 1的这个逻辑根本没有用到,因为如果返回true,那么会如同dfs一样直接返回,不会再进行下一步的backtracking搜索,本题的记忆法核心是令memo[startIndex]置为-1,来避免从相同的startIndex开始拆分,导致程序进行大量重复运算,这应该也是本题剪枝方法的核心。
This commit is contained in:
@ -251,30 +251,34 @@ class Solution {
|
||||
|
||||
// 回溯法+记忆化
|
||||
class Solution {
|
||||
private Set<String> set;
|
||||
private int[] memo;
|
||||
public boolean wordBreak(String s, List<String> wordDict) {
|
||||
Set<String> wordDictSet = new HashSet(wordDict);
|
||||
int[] memory = new int[s.length()];
|
||||
return backTrack(s, wordDictSet, 0, memory);
|
||||
memo = new int[s.length()];
|
||||
set = new HashSet<>(wordDict);
|
||||
return backtracking(s, 0);
|
||||
}
|
||||
|
||||
public boolean backTrack(String s, Set<String> wordDictSet, int startIndex, int[] memory) {
|
||||
// 结束条件
|
||||
if (startIndex >= s.length()) {
|
||||
|
||||
public boolean backtracking(String s, int startIndex) {
|
||||
// System.out.println(startIndex);
|
||||
if (startIndex == s.length()) {
|
||||
return true;
|
||||
}
|
||||
if (memory[startIndex] != 0) {
|
||||
// 此处认为:memory[i] = 1 表示可以拼出i 及以后的字符子串, memory[i] = -1 表示不能
|
||||
return memory[startIndex] == 1 ? true : false;
|
||||
if (memo[startIndex] == -1) {
|
||||
return false;
|
||||
}
|
||||
for (int i = startIndex; i < s.length(); ++i) {
|
||||
// 处理 递归 回溯 循环不变量:[startIndex, i + 1)
|
||||
String word = s.substring(startIndex, i + 1);
|
||||
if (wordDictSet.contains(word) && backTrack(s, wordDictSet, i + 1, memory)) {
|
||||
memory[startIndex] = 1;
|
||||
return true;
|
||||
|
||||
for (int i = startIndex; i < s.length(); i++) {
|
||||
String sub = s.substring(startIndex, i + 1);
|
||||
// 拆分出来的单词无法匹配
|
||||
if (!set.contains(sub)) {
|
||||
continue;
|
||||
}
|
||||
boolean res = backtracking(s, i + 1);
|
||||
if (res) return true;
|
||||
}
|
||||
memory[startIndex] = -1;
|
||||
// 这里是关键,找遍了startIndex~s.length()也没能完全匹配,标记从startIndex开始不能找到
|
||||
memo[startIndex] = -1;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user