重练算法(代码随想录版) day23 - 回溯part2

今日刷题量:3
当前刷题总量:101
Easy: 53
Mid: 46
Hard: 2

Day
常用思想
1.对于组合问题,判断是否需要startIndex来控制for循环的起始位置:

  • 如果是一个集合来求组合的话,就需要startIndex,如leetcode77组合、216组合2
  • 如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,如leetcode17.电话号码的字母组合

2.理解去重到底是同一层的树层来去重,还是同一树枝上即同一组合内去重,特别的,如果是树层去重,要记得对数组排序

3.切割问题和组合问题逻辑类似

4.动态规划预处理字符串所有子串是否为回文
s[i..j] 是回文 ⇔ s[i] == s[j] 且 s[i+1..j−1] 是回文

  1. 长度为 1 的子串一定是回文
  2. 长度为 2 的子串只要 s[i] == s[j] 就是回文
  3. 长度 ≥ 3 才用上面的公式

核心公式:isPalindrome[i][j] = (s[i] == s[j]) && isPalindrome[i+1][j-1]

点击查看代码
 void computePalindrome(const string& s) {
        // isPalindrome[i][j] 代表 s[i:j](双边包括)是否是回文字串 
        isPalindrome.resize(s.size(), vector<bool>(s.size(), false)); // 根据字符串s, 刷新布尔矩阵的大小
        for (int i = s.size() - 1; i >= 0; i--) { 
            // 需要倒序计算, 保证在i行时, i+1行已经计算好了
            for (int j = i; j < s.size(); j++) {
                if (j == i) {isPalindrome[i][j] = true;}
                else if (j - i == 1) {isPalindrome[i][j] = (s[i] == s[j]);}
                else {isPalindrome[i][j] = (s[i] == s[j] && isPalindrome[i+1][j-1]);}
            }
        }

练习题目
39. 组合总和(mid):https://leetcode.cn/problems/combination-sum/
40.组合总和II (mid):https://leetcode.cn/problems/combination-sum-ii/
131.分割回文串 (mid):https://leetcode.cn/problems/palindrome-partitioning/description/

posted @ 2025-11-27 22:36  GengarF  阅读(2)  评论(0)    收藏  举报