需求
给定一个序列,生成序列的所有长度为n的组合。比如,对于序列“123”,那么长度为2的组合有“11”,“12”,“13”,“21”,“22”,“23”,“31”,“32”,“33”,共9种。
应用场景
暴力破解
递归实现
#include<iostream>
#include<string>
using namespace std;
const string ch="01234";//指定字符序列
const int n=5;//指定长度
string str;
long long cnt;
//生成长度为len的所有组合
void combination(int n){
if(str.length()==n){
cout<<str<<endl;
cnt++;
return;
}
for(int i=0;i<ch.length();i++){
str+=ch[i];
combination(n);
str.erase(str.end()-1);
}
}
int main(){
combination(n);
cout<<"total: "<<cnt<<endl;
return 0;
}
迭代实现
#include<iostream>
#include<string>
using namespace std;
const string ch="01234";//指定字符序列
const int n=5;//指定长度
long long cnt;
int aux[n];//辅助数组,aux[i]即str[i]在ch中的位置
int main(){
string str(n,ch[0]);
int p=n-1;
cout<<str<<endl;
cnt++;
while(p>=0){
if(str[p]==ch[ch.length()-1]){
str[p]=ch[aux[p]=0];
p--;
}
else{
str[p]=ch[++aux[p]];
p=n-1;
cout<<str<<endl;
cnt++;
}
}
cout<<"total: "<<cnt<<endl;
return 0;
}