重练算法(代码随想录版) 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 的子串一定是回文
- 长度为 2 的子串只要 s[i] == s[j] 就是回文
- 长度 ≥ 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/

浙公网安备 33010602011771号