leetcode47重复字符串的全排列

参考资料:

[1] leetcode47重复字符串的全排列

注意的问题:

思路:
使用set的方法在最后去掉重复的。那有没更好的呢。
如下是比较优秀的解法:

优秀解法:在全排列之前进行判断是否和前面的数有相等的,如果有相等的话,那就跳过。

class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        
        vector<vector<int> > result;
        
        int nLen=nums.size();
        
        
        
        permuteCore(nums,result,0,nLen-1);
        
        
        
        return result;
    
    }
    
    
    
    void permuteCore(vector<int>& nums,vector<vector<int> >& result,int begin,int end)
    {
        if(begin==end)
            result.push_back(nums);
        else
        {
            for(int i=begin;i<=end;i++)
            {
                if(IsPermute(nums,begin,i))//第i和数和前面是否有重复,如果重复就跳过
                    continue;
                
                swap(nums[begin],nums[i]);
                permuteCore(nums,result,begin+1,end);
                swap(nums[begin],nums[i]);
            }
        }     
    }
    
    bool IsPermute(vector<int> nums,int begin,int end)//如果第几个数和前面有相等的数的话,就跳过去
    {
        bool bFlag = false;
        for(int i=begin;i<end;i++)
        {
            if(nums[end] == nums[i])
                bFlag=true;
        }
        
        return bFlag;
    }    
        
};

普通解法:使用set

class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        
        vector<vector<int> > result;
        
        int nLen=nums.size();
        
        
        
        permuteCore(nums,result,0,nLen-1);
        
        set<vector<int> > result1;
        
        for(int i=0;i<result.size();i++)
        {
            result1.insert(result[i]);
        }
        
        result.clear();
        for(auto iElement= result1.begin(); iElement!= result1.end();iElement++)
        {
            result.push_back(*iElement);
        }
        
        return result;
    
    }
    
    
    
    void permuteCore(vector<int>& nums,vector<vector<int> >& result,int begin,int end)
    {
        if(begin==end)
            result.push_back(nums);
        else
        {
            for(int i=begin;i<=end;i++)
            {
                swap(nums[begin],nums[i]);
                permuteCore(nums,result,begin+1,end);
                swap(nums[begin],nums[i]);
            }
        }
        
        
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容