给定元素范围, 按照一定规则组合成序列

字符组合

1. 问题描述

给定n个字符'a'和n个字符'z', 按照顺序组合成长度为2n的字符串, 求按照字典顺序, 第m个字符串是什么.

2.示例

(1)输入

2 2 6

(2)输出

zzaa

3.解题思路(递归穷举法)

(1).按照长度为n的字符串,每个位置要么是a, 要么是z, 根据这种分类穷举, 可以确定所有给定字符串.
(2). 每个位置的字符选择模式一样, 所以可以使用穷举法
(3).利用c++容器自动排序的功能, 即可得到所有字符串的字典顺序

4.实现代码

#include 
#include 
#include
#include
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<
    }
    //cout<

    int iIndex;
    while(cin>>iIndex)
    {
        if(iIndex>=1&&iIndex<i)
        {
            cout<<stlMap[iIndex]<<endl;
        }
        else
        {
            cout<<-1<<endl;
        }
    }
    return 0;
}

你可能感兴趣的:(算法)