字符组合
1. 问题描述
给定n个字符'a'和n个字符'z', 按照顺序组合成长度为2n的字符串, 求按照字典顺序, 第m个字符串是什么.
2.示例
(1)输入
2 2 6
(2)输出
zzaa
3.解题思路(递归穷举法)
(1).按照长度为n的字符串,每个位置要么是a, 要么是z, 根据这种分类穷举, 可以确定所有给定字符串.
(2). 每个位置的字符选择模式一样, 所以可以使用穷举法
(3).利用c++容器自动排序的功能, 即可得到所有字符串的字典顺序
4.实现代码
#include <iostream>
#include <string>
#include<set>
#include<map>
using namespace std;
unsigned int MAXLENGTH = 0;
//计算所有可能的字符串组合
int GetAllString(int iaNum,int izNum,set<string> & stlSet,int iIndex,const string & str)
{
int iTemp1Num = iaNum;
int iTemp2Num = izNum;
int iTempIndex = iIndex;
string strTempStr = str;
if(iTemp1Num>0)
{
strTempStr+="a";
iTemp1Num--;
iTempIndex++;
if(iTempIndex==MAXLENGTH)
{
stlSet.insert(strTempStr);
}
else
{
GetAllString(iTemp1Num,iTemp2Num,stlSet,iTempIndex,strTempStr);
}
}
iTemp1Num = iaNum;
iTemp2Num = izNum;
iTempIndex = iIndex;
strTempStr = str;
if(iTemp2Num>0)
{
strTempStr+="z";
iTemp2Num--;
iTempIndex++;
if(iTempIndex==MAXLENGTH)
{
stlSet.insert(strTempStr);
}
else
{
GetAllString(iTemp1Num,iTemp2Num,stlSet,iTempIndex,strTempStr);
}
}
}
int main()
{
int na;
int nz;
cin>>na;
cin>>nz;
MAXLENGTH = na+nz;
set<string> stlSet;
string strTemp;
GetAllString(na,nz,stlSet,0,strTemp);
map<int,string> stlMap;
int i=1;
for(auto ite:stlSet)
{
stlMap[i++] = ite;
//cout<<ite<<" ";
}
//cout<<endl;
int iIndex;
while(cin>>iIndex)
{
if(iIndex>=1&&iIndex<i)
{
cout<<stlMap[iIndex]<<endl;
}
else
{
cout<<-1<<endl;
}
}
return 0;
}