枚举法
枚举法与它的马甲们
DFS + Backtracking 的搜索量很大。如果每次 DFS 之前都要进行条件检查的话,优化条件函数可以显著提升程序速度。如 N-Queens 和 Palindrome Partitioning 还有 Sudoku Solver
public class Solution {
public List<String> generateParenthesis(int n) {
List<String> list = new ArrayList<String>();
dfs(list, new StringBuilder(), n, n);
return list;
}
private void dfs(List<String> list, StringBuilder sb, int left, int right){
if(left == 0 && right == 0){
list.add(sb.toString());
return;
}
int length = sb.length();
if(left > 0){
sb.append('(');
dfs(list, sb, left - 1, right);
sb.setLength(length);
}
if(right > left){
sb.append(')');
dfs(list, sb, left, right - 1);
sb.setLength(length);
}
}
}当 DFS 的可能性比较多,而且只在 index 上有区别的时候,用 for 循环就好了。
然并卵,还是超时。
(7/6 号) 回头复习过程中发现,这就是做 search 类题,遇到了记忆化搜索啊。
在 palindrome 问题中,子串之间有天然的 optimal substructure,很适合利用 dp 做预处理解决。
建立一个 String 的所有 substring 是否为 palindrome 的矩阵,时间复杂度为等差数列,约为 (矩阵沿对角线划分的一半区域)
Last updated