题目描述
给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有’a’ < ‘b’ < … < ‘y’ < ‘z’,而且给定的字符串中的字母已经按照从小到大的顺序排列。
输入描述:
输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。
输出描述:
输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:
已知S = s1s2…sk , T = t1t2…tk,则S < T 等价于,存在p (1 <= p <= k),使得s1 = t1, s2 = t2, …, sp - 1 = tp - 1, sp < tp成立。
每组样例输出结束后要再输出一个回车。
示例1
输入
abc
输出
abc
acb
bac
bca
cab
cba
题目解析:可以使用暴力全排列,也可以使用回溯法
代码:
#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
#define M 100
void perm(char * str,vector<string> &ans,int k,int m)
{
if(k==m-1)
ans.push_back(str);
char tmp;
for(int i=k;i<m;i++)
{
tmp=str[k];
str[k]=str[i];
str[i]=tmp;
perm(str,ans,k+1,m);
tmp=str[k];
str[k]=str[i];
str[i]=tmp;
}
}
int main()
{
char str[M];
while(cin>>str)
{
int l=strlen(str);
vector<string> ans;
perm(str,ans,0,l);
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++)
cout<<ans[i]<<endl;
cout<<endl;
}
return 0;
}
/* 暴力全排列,时间复杂度高
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<fstream>
#include<iomanip>
#include<vector>
#include<regex>
#include<map>
#include<set>
#include<stack>
#include<queue>
using namespace std;
string str;
vector<string> vc;
void rst(){
for(int j = 0 ; j < vc.size() ; j++){
for(int i = 1 ; i < str.size() ; i++){
string temp = vc[j];
swap(temp[i] , temp[i-1]);
vector<string>::iterator it = find(vc.begin() , vc.end() , temp);
if(it == vc.end()){
vc.push_back(temp);
}
}
}
}
int main(){
while(cin >> str){
vc.push_back(str);
rst();
sort(vc.begin() , vc.end());
for(int i = 0 ; i < vc.size() ; i++){
cout << vc[i] << endl;
}
cout << endl;
vc.clear();
}
return 0;
}
*/
/* 回溯 ,时间复杂夫小
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<queue>
using namespace std;
vector<string> vc;
string str;
void huishuo(string temp){
if(temp.size() == str.size()){
vc.push_back(temp);
}else{
for(int i = 0 ; i < str.size();i++){
if(temp.find(str[i]) != string::npos){
continue;
}
huishuo(temp + str[i]); //+和+=是不一样的,+不改变temp的值,只传递str[i],+=不一样,temp会改变。例如第一个是a,下一个字母开头应该是b,但是+=是ab
}
}
}
int main(){
string temp = "";
while(cin >> str){
huishuo(temp);
sort(vc.begin() , vc.end());
for(int i = 0 ; i < vc.size();i++){
cout << vc[i] << endl;
}
cout << endl; //狗日的,少个这,没啥用,但是必须这样输出
vc.clear();
}
return 0;
}
*/