题目:
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
算法:
采用递归的方式,将传入的数组在当前位置和其后的所有元素依次交换位置,交换后再依次递归后面的位置。对可能出现的重复元素则不再交换
代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> res;
if(str.length() == 0)return res;
RE(res,str,0);
return res;
}
void RE(vector<string> &res, string &str, int s){
if(s == str.length()){
res.push_back(str);
return;
}
for(int i = s; i < str.length(); i ++){
bool flag = false;
for(int j = s; j < i; j ++){
if(str[j] == str[i]){
flag = true;
continue;
}
}
if(flag)continue;
swap(str[s],str[i]);
RE(res,str,s+1);
swap(str[s],str[i]);
}
return;
}
};
测试程序
int main(int argc, char **argv) {
Solution s;
vector<string> res;
string str;
//输入为“#”时停止程序
while(str != "#")
{
cout << "请输入字符串: ";
cin >> str;
if(str == "#")break;
res = s.Permutation(str);
cout << "所有排列为: ";
for(auto c:res)cout << c << " ";
cout << endl;
}
return 0;
}