LeetCode面试题 08.08. 有重复字符串的排列组合(DFS)

剑指 Offer II 084. 含有重复元素集合的全排列 

面试题 08.08. 有重复字符串的排列组合

LeetCode面试题 08.08. 有重复字符串的排列组合(DFS)_第1张图片

                            

解题思路:

1.对于给定字符串的长度,使得每一种元素在字符串每一个位置都出现一遍。

                

2. 

LeetCode面试题 08.08. 有重复字符串的排列组合(DFS)_第2张图片

                                                                 

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/7p8L0Z/solution/han-you-zhong-fu-yuan-su-ji-he-de-quan-p-qxwv/

来源:力扣(LeetCode)

                                

 代码1:    对于具有相同字符进行优化。

class Solution 
{ 
public:
    vector permutation(string S) 
    {
        int sz = S.size();
        vector ans;
        sort(S.begin(), S.end()); //使相同的元素在一起

        vector visited(sz,0);

        string path=S;
        DFS(ans,0, visited, S, path);

        return ans;
    }

    void DFS( vector& ans,int n, vector &visited, const string &s, string &path) 
    {
        if (n == visited.size()) //返回条件,string中字符个数已经够了
        {
            ans.push_back(path);
            return;
        }

        for (int i = 0; i < s.size(); ++i) 
        {
            if (visited[i]) 
            continue;
            
            //只使用第一个重复的元素
            if (i > 0 && s[i] == s[i - 1] && !visited[i - 1]) 
            continue;

            visited[i] = 1;//标记已访问
            path[n] = s[i];
            DFS(ans, n + 1, visited, s, path); //使每一种元素在每个位置都出现一遍
            visited[i] = 0; //回溯
        }
    }
};

                                         

     代码2: 通用解法,暴力求解          

class Solution {
public:
    set store; //用于存储结果
    vector ret;

    void dfs(string& s, string& cur, vector& used){
        if(cur.size() == s.size())
        {
            store.insert(cur);
            return;
        }

        for(int i = 0; i < s.size(); ++i)
        {
            if(used[i]) //这个字符被使用过了,寻找未被使用的
            continue;

            cur += s[i];
            used[i] = true;
            dfs(s, cur, used);
            used[i] = false;
            cur.pop_back();
        }
    }

    vector permutation(string s) 
    {
        string cur = "";
        vector used(s.size(), false);//标记字符是否被使用
        dfs(s, cur, used);

        for(auto& ele : store) 
         ret.push_back(ele);

        return ret;
    }  
};

你可能感兴趣的:(力扣刷题,leetcode)