void subsetsWithDup(const vector<int>& nums, vector<int> tmp, vector<vector<int>>& ret, int i) { if(i == nums.size() && find(ret.begin(), ret.end(), tmp) == -1) { ret.push_back(tmp); return ; } subsetsWithDup(nums, tmp, ret, i + 1); tmp.push_back(nums[i]); subsetsWithDup(nums, tmp, ret, i + 1); tmp.pop_back(); }
vector<vector<int> > sorted_subsetsWithDup(vector<int> &S) { vector<vector<int> > ans; if (S.size() == 0) { vector<int> temp; ans.push_back(temp); return ans; } int back = S.back(); int dup_len = 0; do { S.pop_back(); dup_len++; } while((S.size() > 0) && (S.back() == back)); vector<vector<int> > without_back = subsetsWithDup(S); ans = without_back; for (int l = 0; l < dup_len; ++l) { for (int i = 0; i < without_back.size(); ++i) { without_back[i].push_back(back); ans.push_back(without_back[i]); } } return ans; }
vector<vector<int> > subsetsWithDup(vector<int> &S, map<vector<int>,int> &nochoice) { // Start typing your C/C++ solution below // DO NOT write int main() function vector<vector<int> > result; if(S.size() == 0) { vector<int> empty; result.push_back(empty); return result; } else { int last = S[S.size()-1]; S.pop_back(); result = subsetsWithDup(S,nochoice); vector<vector<int> > new_result; for(int i = 0; i < result.size(); i++) { vector<int> tmp(result[i].begin(),result[i].end()); tmp.push_back(last); map<vector<int>,int>::iterator it = nochoice.find(tmp); if(it == nochoice.end()) { nochoice.insert(map<vector<int>,int>::value_type(tmp,1)); new_result.push_back(tmp); } } for(int i = 0; i < new_result.size(); i++) result.push_back(new_result[i]); return result; } }
vector<vector<int>> subsetsWithDup(vector<int>& nums) { vector<int> v = {}; vector<vector<int>> ret; sort(nums.begin(), nums.end()); subsetsWithDup(nums, v, 0, ret); return ret; }
void subsetsWithDup(vector<int> &nums, vector<int> &v, int beg, vector<vector<int>> &ret) { ret.push_back(v); for(int i = beg; i < nums.size(); ++i) { if(i == beg || nums[i] != nums[i-1]) //eliminate duplications { v.push_back(nums[i]); subsetsWithDup(nums, v, i + 1, ret); v.pop_back(); } } }
int main(void) { int i, n, **res, *col; int j; int x[] = { 1, 2, 2 }; res = subsetsWithDup(x, 3, &col, &n); for (i = 0; i < n; i++) { for (j = 0; j < col[i]; j++) printf("%d ", res[i][j]); printf("\n"); } return(0); }
vector<vector<int>> subsetsWithDup(vector<int>& nums) { vector<vector<int>> ret; subsetsWithDup(nums, vector<int>(), ret, 0); return ret; }
vector<vector<int> > subsetsWithDup(vector<int> &S) { map<vector<int>,int> nochoice; sort(S.begin(),S.end()); return subsetsWithDup(S,nochoice); }