全排列-回溯46-C++&python

版本一:给定一个 没有重复 数字的序列,返回其所有可能的全排列,按字典序输出。

class Solution {
public:
    
    void perm(vector<vector<int>>& res, vector<int>& arr, int p, int q){
        vector<int> temp;
        if(p == q){
            temp = arr;
            res.push_back(temp);
        }
        for(int i = p; i <= q; i++){
            swap(arr[p], arr[i]);
            perm(res, arr, p + 1, q);
            swap(arr[p], arr[i]);
        }
    }
    
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> res;
        perm(res, nums, 0, nums.size() - 1);
        sort(res.begin(), res.end());
        return res;
    } 
};

版本二:输入一个字符串,按字典序打印出该字符串中字符的所有排列,可能有字符重复。(需要对结果数组进行去重)

class Solution {
public:
    
    void perm(vector<string>& res, string s, int p, int q){
        string temp;
        if(p == q){
            temp = s;
            res.push_back(temp);
        }
        for(int i = p; i <= q; i++){
            swap(s[p], s[i]);
            perm(res, s, p + 1, q);
            swap(s[p], s[i]);
        }
    }
    
    vector<string> Permutation(string str) {
        vector<string> res;
        perm(res, str, 0, str.length() - 1);
        map<string, int> map;
        for(auto v : res){
            if(map.find(v) == map.end()){
                map[v]++;
            }
        }
        vector<string> finalres;
        for(auto v : map){
            finalres.push_back(v.first);
        }
        return finalres;
    }
};

python

from copy import deepcopy

class Solution:
    def permute(self, nums: List[int]):
        n = len(nums)
        res = []
        track = []

        def backtrack(nums, track):
            if len(track) == n:
                res.append(deepcopy(track))
                return
            
            for i in range(n):
                if nums[i] in track:
                    continue
                
                track.append(nums[i])
                backtrack(nums, track)
                track.pop()
        
        backtrack(nums, track)
        
        return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值