生成可重集的排列
比如说我现在想要知道hello的所有排列方法,且有多少个?
#include <iostream> #include <string> #include <algorithm> using namespace std; int n; string line; string sequence; int count_; void print_permutation(int i){ if(i == n){ for(int y=0; y<n; ++y) cout<<sequence[y]; cout<<endl; count_++; return ; } else{ for(int j=0; j<n; ++j){ if(!j || line[j] != line[j-1]){ //防止出现重复 int count1=0 , count2=0; for(int x=0; x<n; ++x) if(line[x] == line[j]) ++count1; //整个一个词里面有多少个 line[j] for(int x=0; x<i; ++x) if(sequence[x] == line[j]) ++count2; if(count2 < count1){ //已经放到sequence里面的line[j]不多于总数才可以继续 sequence[i] = line[j]; print_permutation(i+1); } } } } } int main(){ count_=0; getline(cin, line); n = line.size(); sort(line.begin(), line.end()); print_permutation(0); cout<<"count="<<count_<<endl; return 0; }