不想看文字的可以在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