问题描述
剑指offer38题
问题分析
最直观的想法就是使用深度搜索遍历每一个分支,找出所有组合,但是此问题要求结果中的字符串不重复,这就需要我们在使用DFS时进行剪枝,即是在每一层将重复的字符去除。
以abc和aab为例,红色表示被去除的分支。
代码实现
dfs剪枝
vector<string> result;
void perm(unsigned start, string str) {
if (start == str.size() - 1) {
result.push_back(str);
return;
}
set<int> st;
for (unsigned i = start; i < str.size(); i++) {
if (st.find(str[i]) != st.end()) continue; //查找到的第一个对应字符
//不是集合中的最后一个也就是本层次之前已经有了该字符,则需要剪枝
st.insert(str[i]);
swap(str[start], str[i]);
perm(start + 1, str);
swap(str[start], str[i]);//恢复原状态
}
}
使用next_permutation函数
vector<string> permutation(string s) {
sort(s.begin(), s.end());
vector<string> ans;
do ans.push_back(s);
while (next_permutation(s.begin(), s.end()));
return ans;
}