class Solution {
public:
vector<vector<int> > ret;
vector<int> sln;
void DFS(vector<int> &S, int n) {
if (S.size() == n) {
ret.push_back(sln);
return;
}
int count = 1;
while (n + 1 < S.size() && S[n] == S[n + 1]) {
count++;
n++;
}
for (int i = 0; i <= count; i++) {
for (int j = 0; j < i; j++)
sln.push_back(S[n]);
DFS(S, n + 1);
for (int j = 0; j < i; j++)
sln.pop_back();
}
}
vector<vector<int> > subsetsWithDup(vector<int> &S) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
ret.clear();
sln.clear();
sort(S.begin(), S.end());
DFS(S, 0);
return ret;
}
};
Small Case: 4ms
Large Case: 56ms
Time: O(2^n)
Space: O(2^n)