Q9.4 Write a method that returns all subsets of a set.

来源:互联网 发布:树熊网络wifi如何登录 编辑:程序博客网 时间:2024/05/29 15:07

Q:Write a method that returns all subsets of a set.

A:DFS.

#include <iostream>#include <vector>#include <algorithm> using namespace std;void dfs(const vector<int> &s, int start, vector<int> &path, vector<vector<int> > &res) {if (start == s.size()) {res.push_back(path);return ;}for (int i = start; i < s.size(); i++) {path.push_back(s[i]);dfs(s, i+1, path, res);path.pop_back();}res.push_back(path);return ;}vector<vector<int> > subsets(vector<int> &A) {vector<vector<int> > res;if (A.size() == 0) {return res;}vector<int> cur;dfs(A, 0, cur, res);return res;}void printResult(vector<vector<int> > &res) {for (int i = 0; i < res.size(); i++) {cout<<"[";for (int j = 0; j <res[i].size(); j++) {cout<<res[i][j];if (j != res[i].size()-1) {cout<<",";}}cout<<"]"<<endl;}}void dfs2(const vector<int> &s, int start, vector<int> &path, vector<vector<int> > &res) {    if (start == s.size()) {        res.push_back(path);        return ;    }    int prev = s[start]+1;    for (int i = start; i < s.size(); i++) {        if (prev == s[i]) {            continue;        }        prev = s[i];        path.push_back(s[i]);        dfs2(s, i+1, path, res);        path.pop_back();    }    res.push_back(path);    return ;}//如果存在重复元素 vector<vector<int> > subsetsWithDup(vector<int> &S) {    sort(S.begin(), S.end());    vector<vector<int> > res;    vector<int> path;    dfs2(S, 0, path, res);    return res;}    int main() {vector<int> A;for (int i = 1; i <= 3; i++) {A.push_back(i);}vector<vector<int> > res = subsets(A);printResult(res);cout<<endl;A[2] = 2;res = subsetsWithDup(A);printResult(res);return 0;}


0 0
原创粉丝点击