回溯算法总结
回溯算法总结
回溯三部曲:
(1)确定递归函数以及参数
(2)找到回溯终止条件
(3)找到单层递归搜索逻辑
重点:
通过画图确定思路
使用used数组进行去重
对于数独需要二重递归
重点题目
(1)组合问题
(2)子集问题
(3)分割字符串问题
(4)全排列问题
(5)N皇后和解数独问题
1.分割回文串
链接:https://leetcode.cn/problems/palindrome-partitioning/
题意: 给你一个字符串,求不同的分割方案使每个子串都是回文串
思路: 从不同的位置开始分割,然后往深层递归判断这种方式是否可行,当分割的位置大于等于字符串长度时,递归结束。
class Solution {
private:
vector<vector<string>> ans;
vector<string> path;
vector<vector<bool>> ispalindrome;
void dfs (string s, int st) {
if (st >= s.size()) {
ans.push_back(path);
return ;
}
for (int i = st; i < s.size();i ++) {
if (ispalindrome[st][i]) {
string str = s.substr(st,i - st + 1);
path.push_back(str);
}
else continue;
dfs(s,i + 1);
path.pop_back();
}
}
void cal_ispalindrome (string s){
ispalindrome.resize(s.size(),vector<bool>(s.size(), false));
for (int i = s.size() - 1; i >= 0; i --) {
for (int j = i; j < s.size(); j ++) {
if (i == j) {
ispalindrome[i][j] = 1;
}
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]);
}
}
}
public:
vector<vector<string>> partition(string s) {
cal_ispalindrome(s);
dfs(s,0);
return ans;
}
};
七月在野,八月在宇,九月在户,十月蟋蟀入我床下