美文网首页
Permutation 全排列

Permutation 全排列

作者: leon4ever | 来源:发表于2018-03-20 14:37 被阅读18次

递归解决全排列(回溯法)

回溯法的思路也不难理解。
考察其如何递归,以1234为例。首先需要考虑第一位,可以以此与后续元素交换得到2-134, 3-214, 4-231.
然后对后三位递归地调用(与后续元素交换)即可。当递归到无法交换(就剩一位),则输出。

class Solution1{
public:
    vector<string> permute(string s){
        vector<string> result;
        helper(result, s, 0);
        return result;
    }

    void helper(vector<string>& result, string& s, int index){
        if(index == s.size()-1)
            result.push_back(s);
        for(int i = index; i<s.size(); ++i){
            swap(s[index],s[i]);
            helper(result, s, index+1);
            swap(s[index],s[i]);
        }
    }
};

考虑重复元素

由于全排列就是从第一个数字起每个数分别与它后面的数字交换。我们先尝试加个这样的判断——如果一个数与后面的数字相同那么这二个数就不交换了。如122,第一个数与后面交换得212、221。然后122中第二数就不用与第三个数交换了,但对212,它第二个数与第三个数是不相同的,交换之后得到221。与由122中第一个数与第三个数交换所得的221重复了。所以这个方法不行。

换种思维,对122,第一个数1与第二个数2交换得到212,然后考虑第一个数1与第三个数2交换,此时由于第三个数等于第二个数,所以第一个数不再与第三个数交换。再考虑212,它的第二个数与第三个数交换可以得到解决221。此时全排列生成完毕。

这样我们也得到了在全排列中去掉重复的规则——去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。用编程的话描述就是第i个数与第j个数交换时,要求[i,j)中没有与第j个数相等的数。下面给出完整代码:

class mySolution02{
public:

    bool isduplicate(string& s, int start, int end){
        for(int i = start ; i<end; ++i){
            if(s[i] == s[end])
                return true;
        }
        return false;
    }
    vector<string> permute(string s){
        sort(s.begin(), s.end());
        vector<string> result;
        helper(result, s, 0);
        return result;
    }

    void helper(vector<string>& result, string& s, int index){
        if(index == s.size()-1)
            result.push_back(s);
        for(int i = index; i<s.size(); ++i){
            if(isduplicate(s, index, i))
                continue;
            swap(s[index],s[i]);
            helper(result, s, index+1);
            swap(s[index],s[i]);
        }
    }
};

相关文章

  • Permutation 全排列

    递归解决全排列(回溯法) 回溯法的思路也不难理解。考察其如何递归,以1234为例。首先需要考虑第一位,可以以此与后...

  • 全排列

    对于函数prev_permutation()与next_permutation()全排列的用法直接观察输入输出,一...

  • 全排列问题偷鸡做法

    全排列问题偷鸡摸狗做法用强大的(猥琐的)next_permutation 31. 下一个排列 46. 全排列 47...

  • 递归-全排列

    对数组{1,2,3}进行全排列 STL next_permutation

  • LeetCode 46. 全排列

    46. 全排列 题目来源:https://leetcode-cn.com/problems/permutation...

  • HJ89 24点运算

     解法思想,全排列+递归。 Reference[1] next_permutation 的原理和使用[https:...

  • 数组全排列

    递归实现 库函数实现 获取所有元素的全排列:itertools.permutation(lst, n) ——n:...

  • 全排列(next_permutation)算法

    功能: 给定一个具有n个元素的集合,要求输出这个集合中元素的全部可能的排列。 STL有一个函数next_permu...

  • 46+47、Permutations、Permutations2

    数组全排列 Permutation Example 思路递归的方法,设置一个used数组,用来记录相应位置是否已经...

  • C/C++全排列函数

    C++中有全排列函数next_permutation,前提是数据必须有序,因此先对其进行排序,再使用该函数: 全排...

网友评论

      本文标题:Permutation 全排列

      本文链接:https://www.haomeiwen.com/subject/mxtbqftx.html