回溯算法总结

回溯算法总结

回溯三部曲:
(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;
    }
};
posted @ 2022-11-03 16:28  voids5  阅读(20)  评论(0编辑  收藏  举报