此题与 subset | 相比,给定的数组中存在重复的元素,为了避免子集中出现重复,在DFS过程中需要判断具体情况
具体思路参考http://www.cnblogs.com/TenosDoIt/p/3451902.html
代码
class Solution {
public:
vector<vector<int> > subsetsWithDup(vector<int> &S) {
vector<vector<int> > res;
vector<int> tempSubset;
sort(S.begin(), S.end());
subsetHelper(res, tempSubset, 0, S);
return res;
}
void subsetHelper(vector<vector<int> > &res, vector<int> tempSubset, int iEnd, vector<int> S)
{
if(iEnd==S.size())
{
res.push_back(tempSubset);
return;
}
int firstSameNum = iEnd;
//对于某一元素,若其重复,则找到在原数组中该元素第一个出现的位置
while(firstSameNum>=0&&S[firstSameNum]==S[iEnd]) firstSameNum--;
//减‘一’是为了去除当前元素
int sameCnt = iEnd - firstSameNum-1;
//若该元素在已遍历的数组中没有重复元素 或者 有重复元素且在tempSubset中该重复元素的个数即为到目前为止遍历原来的数组S时重复出现该元素的个数
//此时即将该元素加入tempSubset
if(sameCnt==0||sameCnt<=tempSubset.size()&&tempSubset[tempSubset.size()-sameCnt]==S[iEnd])
{
tempSubset.push_back(S[iEnd]);
subsetHelper(res, tempSubset, iEnd+1, S);
tempSubset.pop_back();
}
subsetHelper(res, tempSubset, iEnd+1, S);
}
};