生成可重集的排列

比如说我现在想要知道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;
}

 

posted @ 2020-04-20 17:21  Abel_chen  阅读(191)  评论(0)    收藏  举报