去重排列树
vector<string> vec;
vector<string> permutation(string s)
{
dfs(s,0);
return vec;
}
//x为固定的下标位置
void dfs(string &str,int x)
{
//固定的位置为末尾,则不用再进行交换
if(x == s.size()-1)
{
vec.push_back(str);
return;
}
set<int> st; //每层都有一个set,用于过滤同一位置的相同元素
for(int k = x; k < s.size(); ++k)
{
if(st.find(k) != st.end())
{
continue;
}
st.insert(s[k]); //插入固定的下标位置的元素
swap(str[k],str[x]); //交换
dfs(s,x+1);
swap(str[k],str[x]); //恢复原顺序
}
}
子集树
vector<int> state;
void fun(vector<int>& v)
{
state.resize(v.size(),0);
dfs(v,0);
}
void dfs(vector<int>& v,int i)
{
if(i == v.size())
{
for(int j = 0;j<v.size();++j)
{
if(state[j] == 1)
{
cout << v[j] << " ";
}
}
cout << endl;
}
else
{
state[i] = 1;
dfs(v,i+1);
state[i] = 0;
dfs(v,i+1);
}
}