回溯法集锦(26)

https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/submissions/
实际上就是全排列。不过变成了不定长的数据。

class Solution {
public:
    string str[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    vector<string> ans;
    string temp_ans;
    int n;
    vector<string> letterCombinations(string digits) {
        n=digits.size();
        if(n==0) return ans;
        dfs(digits,0);
        return ans;
    }
    void dfs(string digits,int deep){
        if(deep==n){
            ans.push_back(temp_ans);
            return ;
        }else{
            string base=str[digits[deep]-'0'];//注意字符是ASCII码
            int s=base.size();
            for(int i=0;i<s;i++){
                char ss=base[i];
                temp_ans.push_back(ss);
                dfs(digits,deep+1);
                temp_ans.pop_back();
            }
        }
        return ;
    }
};

https://leetcode-cn.com/problems/subsets/
全部子集

class Solution {
public:
    vector<vector<int>> ans;
    vector<int> temp_ans;
    int n;
    vector<vector<int>> subsets(vector<int>& nums) {
        n=nums.size();//数字个数,如果用int n的话,使用n的时候会使用全局变量的n=0恒为0
        dfs(nums,0);
        return ans;
    }
    void dfs(vector<int>& nums,int deep){
        if(deep==n){
            ans.push_back(temp_ans);
            return ;
        }else{
            dfs(nums,deep+1);
            temp_ans.push_back(nums[deep]);
            dfs(nums,deep+1);
            temp_ans.pop_back();
        }
        return ;
    }
};

https://leetcode-cn.com/problems/combination-sum/
目前认为emplace_back约等于push_back,但是实际上,在一定的特例上,不一定有相同效果。

class Solution {
public:
    vector<vector<int>> ans;
    vector<int> combine;
    int n;
    void dfs(vector<int>& candidates, int target, int idx) {
        if (idx == n) return;
        if (target == 0) {
            ans.emplace_back(combine);
            return;
        }
        // 选择当前数
        if (target - candidates[idx] >= 0) {
            combine.emplace_back(candidates[idx]);
            dfs(candidates, target - candidates[idx], idx);
            combine.pop_back();
        }
        // 直接跳过
        dfs(candidates, target, idx + 1);
    }

    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        n=candidates.size();
        dfs(candidates, target, 0);
        return ans;
    }
};

实际上,这也算是一个背包问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值