字典序问题(C++)-计算机算法设计与分析第一单元算法实现题1-2

该博客讨论了如何解决字典序问题,即给定一个字符串,根据字母顺序编号,找出其在所有可能组合中的位置。算法分析涉及对组合公式进行化简,并通过递归处理不同长度的子字符串,排除不符合条件的首字母组合。博客提供了B站上的详细视频讲解链接。
摘要由CSDN通过智能技术生成

不想看文字的可以在B站看详细的讲解,点击蓝字->字典序问题

字典序问题

在这里插入图片描述

题干分析

字符串按字母顺序a,b,c,d,e,f,g…任意组合,且每个字母只出现一次,并按顺序进行编号,组合后的字符串长度最低是1,即a编号为1,之后依次为其他组合情况编号,组合字符串长度最高是6,即uvwxyz是编号的最后一个。

现给出一串字符,求其编号。

算法分析

假设求长度为n的字符串的编码。
则长度小于(n-1)的字符串组合包括所有情况,用组合公式可算出。
如,长度为2的字符串的所有情况就是从26个字母中选择2个字母进行组合,C262
在这里插入图片描述
注:在求26的阶乘时数据过大,超出整型的范围,所以在这里对上述公式进行化简。变成:

用一个for循环将C261到C26n-1累加起来。
在这里插入图片描述
分析长度为n时的情况:

长度为n时:
1)若首字母为a,则要继续看下一字母;
2)若首字母为b,则要求出首字母为a的所有情况,再继续看下一字母;

 (由于要按照字母表顺序排列,首字母为a的情况相当于已经确定了接下来的字符中没有a,于是是从25个字母中选(n-1)个进行组合)

3)若首字母为c,则要求出首字母为a的情况和首字母为b的情况,再继续看下一字母;

(此时确定了接下来的字符中没有a和b)

确定首字母后则看下一字母,此时字符串长度变为n-1,情况与长度为n时相同,但要排除掉首字母的顺序在上一字母之前的情况[^1],直到看到最后一位,即n<1时递归结束。

[^1]假设长度为n时首字母是b,那么长度为n-1时,由于组合按照字母顺序排列,且每个字母只出现一次,则长度为n-1且首字母为a或b的情况是不满足组合规则的,需要排除掉。

最后将所有情况加起来再加1,即为所求字符串编号。(加的1是字符串本身)

#include <iostream>
#include <string.h>
#include<fstream>
using 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值