47. Permutations II && 面试题 08.08. Permutation II LCCI && 面试题38. 字符串的排列

Problem

47

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

Example

Input: [1,1,2]
Output:
[
[1,1,2],
[1,2,1],
[2,1,1]
]

面试题08.08

Write a method to compute all permutations of a string whose charac­ ters are not necessarily unique. The list of permutations should not have duplicates.

Example1

Input: S = “qqe”
Output: [“eqq”,“qeq”,“qqe”]

Example2

Input: S = “ab”
Output: [“ab”, “ba”]

面试题38

输入一个字符串,打印出该字符串中字符的所有排列。

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

Example

输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]

Solution

46. Permutations&&面试题 08.07. Permutation I LCCI的基础之上,输入中可能存在重复。

画出搜索树
在这里插入图片描述

Solution 47

class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<vector<int>> ret;
        if(nums.empty())
            return ret;
        
        sort(nums.begin(),nums.end());

        vector<bool> used(nums.size(),false);

        vector<int> tmp;

        backtrack(nums,used,tmp,ret);

        return ret;
    }

    void backtrack(vector<int> &nums,vector<bool> &used,vector<int> &tmp,vector<vector<int>> &ret)
    {
        if(tmp.size() == nums.size())
        {
            ret.push_back(tmp);
            return;
        }

        for(int i = 0;i<nums.size();++i)
        {
            if(used[i])
                continue;
            //注意这里的剪枝条件,特别是最后一个used[i-1] == false
            if(i > 0 && nums[i] == nums[i-1] && used[i-1] == false)
                continue;
            
            tmp.push_back(nums[i]);
            used[i] = true;

            backtrack(nums,used,tmp,ret);

            tmp.pop_back();
            used[i] = false;
        }
    }
};

Solution 面试题08.08 && 面试题38

class Solution {
public:
    vector<string> permutation(string S) {
        vector<string> ret;
        if(S.empty())
            return ret;
        string tmpS = "";
        vector<bool> used(S.length(),false);
        sort(S.begin(),S.end());
        backtrack(S,used,tmpS,ret);

        return ret;

    }

    void backtrack(string &S,vector<bool> &used,string &tmpS,vector<string> &ret)
    {
        if(tmpS.length() == S.length())
        {
            ret.push_back(tmpS);
        }

        for(int i = 0;i<S.length();++i)
        {
            if(used[i])
                continue;
            if(i > 0 && S[i] == S[i-1] && used[i-1] == false)
                continue;
            
            tmpS += S[i];
            used[i] = true;

            backtrack(S,used,tmpS,ret);
            
            tmpS = tmpS.substr(0,tmpS.length() - 1);
            used[i] = false;
        }
    }
};

Ref

https://leetcode-cn.com/problems/permutations-ii/solution/hui-su-suan-fa-python-dai-ma-java-dai-ma-by-liwe-2/

发布了547 篇原创文章 · 获赞 217 · 访问量 56万+

猜你喜欢

转载自blog.csdn.net/sjt091110317/article/details/105182042