> Given a collection of integers that might contain duplicates, S, return all possible subsets. Note: Elements in a subset must be in non-descending order. The solution set must not contain duplicate subsets. For example, If S = [1,2,2], a solution is: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]
Copy void searchWithDup(vector<vector<int> >& result, vector<int> &sub, vector<int> &S, int k, int start)
{
if(sub.size() == k)
{
//also can add, at last, remove the duplicated
if(std::find(result.begin(), result.end(), sub) != result.end())
return;
result.push_back(sub);
return;
}
for(int i = start; i < S.size(); i++)
{
sub.push_back(S[i]);
searchWithDup(result, sub, S, k, i+1);
sub.pop_back();
}
}
vector<vector<int> > subsetsWithDup(vector<int> &S)
{
std::sort(S.begin(), S.end());
vector<vector<int> > result;
for(int i = 0; i <= S.size(); i++)
{
vector<int> sub;
searchWithDup(result, sub, S, i, 0);
}
//remove the duplicated, if didnot check when add in searchWithDup
//std::sort(result.begin(), result.end());
//result.erase(std::unique(result.begin(), result.end()), result.end());
return move(result);
}
Copy void search(vector<vector<int> > &result, const vector<int> &S, vector<int> &input, int start, int k)
{
if(input.size() == k){
result.push_back(input);
return;
}
for(int i = start; i < S.size(); i++){
if(i != start && S[i] == S[i-1]) continue;
input.push_back(S[i]);
search(result, S, input, i+1, k);
input.pop_back();
}
}
vector<vector<int> > subsetsWithDup(vector<int> &S)
{
std::sort(S.begin(), S.end());
vector<vector<int> > result;
vector<int> input;
for(int k = 0; k <= S.size(); k++)
search(result, S, input, 0, k);
return move(result);
}