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

字符组合

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值