DS & Algorithm | 回溯算法(Back Tracking)

一、回溯算法

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。

通常适用于求解排列组合、所有路径等问题。

二、递归模板

void backTracking(索引, 选择列表)
{
    if(满足条件) {
        添加结果路径;
        return;
    }
    for(可选择节点) {
        选择节点;
        backTracking(索引, 选择列表);
        返回上一层;
    }
}

三、例子

  1. LeetCode-17 “电话号码的字母组合”(c++)
class Solution {
public:
    vector<string> vs= {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
    vector<string> res;
    string path;

    vector<string> letterCombinations(string digits) { 
        if(digits.length() == 0) return {};

        backTracking(0, digits);
        return res;
    }
    /* 回溯法 */
    void backTracking(int index, string digits) {
        if(index == digits.length()) {
            res.push_back(path);
            return;
        }
        for(int i = 0; i < vs[(int)(digits[index] - '0')].length(); i++) {
            path.push_back(vs[(int)(digits[index] - '0')][i]);
            backTracking(index+1, digits);
            path.pop_back();
        }
    }
};
posted @ 2021-01-30 16:38  Einsier  阅读(147)  评论(0)    收藏  举报