题目:输入一个字符串,输出该字符串中所有字符的排列组合。
如abc,输出:abc acb bac bca cab cba
经典的深度搜索问题。
分为两种情况:
1.无重复元素,如上面的例子abc。
2.有重复元素,如aa,只有一种组合aa。
一. 无重复元素
代码如下:
vector<string> permutation(string str) {
vector<string> results;
dfs(str, 0, results);
return results;
}
void dfs(string str, int left, vector<string>& results){
int size = str.size();
if(left == size) {
results.emplace_back(str);
return;
}
for(int i = left; i < size; ++i) {
swap(str, i, left);
dfs(str, left+1, results);
swap(str, i, left);
}
}
void swap(string& str, int i, int j) {
char c = str[i];
str[i] = str[j];
str[j] = c;
}
二. 有重复元素
例如:输入"qqe"
输出:[“qqe”,“qeq”,“eqq”]
下面的例子假设输入的字符串只有字母。用一个vector数组表示该字符是否访问过。
vector<string> permutation(string str) {
vector<string> results;
dfs(str, 0, results);
return results;
}
void dfs(string str, int left, vector<string>& results) {
int size = str.size();
if (left == size) {
results.push_back(str);
return;
}
vector<bool> visited(60, false);
for (int i = left; i < size; ++i) {
int index = str[i] - 'A';
if (visited[index] == false) {
visited[index] = true;
swap(str, i, left);
dfs(str, left+1, results);
swap(str, i, left);
}
}
}
void swap(string& str, int i, int j) {
char c = str[i];
str[i] = str[j];
str[j] = c;
}
有重复元素时,代码与上面类似,但是要加一个flag判断是否访问过,没有访问过的,才会继续深度搜索
Leetcode上有类似的题目:
http://blog.youkuaiyun.com/okiwilldoit/article/details/20631935