问题描述:给出字符串s="abc",求其所有可能的排列。
分析:对于一个给定的字符串,其排列公式是A(n,1),n为字符串的长度。
解题思路:依次取字符串中的一个字符,然后遍历整个字符串,跳过其本身,再依次取字符对其求排列。问题的关键在于,循环的层数是根据字符串的长度变化的,所以使用递归可以对本题快速求解。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// 查找当前的字符是否存在于position集合中
int
exists_data(vector<int> pos, int num) {
if (pos.size() <= 0)
return 0;
for (int i = 0; i < pos.size(); i++) {
if (pos[i] == num)
return 1;
}
return 0;
}
// 递归地求字符串的组合
void
combination(vector<char> v_capacity,
vector<int> position,
vector<char>& s_output,
bool& signal) {
for (int i = 0; i < v_capacity.size(); i++) {
if (position.size() == v_capacity.size()) {
if (signal) {
s_output.push_back(',');
s_output.push_back(' ');
}
for (int idx = 0; idx < position.size(); idx++)
s_output.push_back(v_capacity[position[idx]]);
signal = true;
return;
}
if (exists_data(position, i))
continue;
position.push_back(i);
combination(v_capacity, position, s_output, signal);
position.pop_back();
}
}
// 将字符串转换成字符集合
void
parttern(string s, vector<char>& v_capacity) {
for (int i = 0; i < s.length(); i++)
v_capacity.push_back(s[i]);
sort(v_capacity.begin(), v_capacity.end());
}
// 删除相同的元素
void
delete_identical(vector<char> v_capacity, int raw_len, vector<string>& vs_capacity) {
string s;
int count = 0;
vector<string> v_to_vs_capacity;
for (int i = 0; i < v_capacity.size(); i++) {
s.push_back(v_capacity[i]);
if (s.length() == raw_len) {
v_to_vs_capacity.push_back(s);
s.clear();
i += 2;
}
}
vs_capacity.push_back(v_to_vs_capacity[0]);
for (int i = 1; i < v_to_vs_capacity.size(); i++) {
for (int j = 0; j < vs_capacity.size(); j++) {
if (v_to_vs_capacity[i].compare(vs_capacity[j]) == 0)
break;
else if (j == vs_capacity.size() - 1) {
vs_capacity.push_back(", ");
vs_capacity.push_back(v_to_vs_capacity[i]);
}
}
}
}
int main(int argc, char** argv) {
string s;
cin >> s;
vector<char> v_cup;
vector<int> pos;
parttern(s, v_cup);
vector<char> output;
bool signal = false;
combination(v_cup, pos, output, signal);
vector<string> vs_output;
delete_identical(output, s.length(), vs_output);
cout << '[';
for (int i = 0; i < vs_output.size(); i++)
cout << vs_output[i];
cout << ']' << endl;
system("pause");
return 0;
}
例如:输入acc, 输出[acc, cac, cca]