递归逐层确认即可
#include<iostream> #include<string> #include<vector> using namespace std; //相当于一根不完全的n叉树 void PaiLie(string str,vector<int> remain,int* seq,int length,int remove=-1,int layer=0){ if(layer!=0){ *(seq+layer-1) = remain.at(remove);//确认掉本层的字母 remain.erase(remain.begin()+remove); } if(layer==length){//生成了一个完整的序列 for(int i=0;i<length;i++) cout<<str[seq[i]]; cout<<endl; } else {//序列不完整,继续生成 int n = remain.size(); for(int i=0;i<n;i++){ PaiLie(str,remain,seq,length,i,layer+1); } } } int main(){//习题8.2 北京大学 输出字符串的全排列 //生成一个数字序列的全排列,再按照该排列打印字符串即可 //示例给出的打印顺序是123 132 213 231 312 321 string str; while(cin>>str){ vector<int> id; int n = str.size(); int* seq = (int*)malloc(sizeof(int)*n); for(int i=0;i<n;i++){ id.push_back(i); } PaiLie(str,id,seq,n); } }