字典序问题

hlyjl 2011-11-02 05:11:44
请教字典序问题的算法思想,请高手指教下,具体问题如下:
在数据压缩和数据加密过程中常需要对特殊的字符串进行编码. 给定的字母表A由26个小写英文字母组成A ={a,b,...z}. 该字母表产生的升序字符串指的是字符串中字母按照从左到右出现的次序与字母表中出现的次序相同,且每个字符最多出现1次. 例如,a,b,ab,xyz,ax等都是升序字符串. 现在对字母表A产生的所有长度不超过6的升序字符串按照字典序排列如下.
1 2 3 … 26 27 28 …
a b c … z ab ac …
对于给定长度不超过6的升序字符串,编程计算出它在上述字典中的编码.
Input
输入数据的第1行是一个正整数k,表示接下来共有k行.在接下来的k行中,每行给出一个字符串.
Output
输出结果,每行对应于一个字符串的编码.
Sample Input
2
a
b
output
1
2
...全文
307 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
nice_cxf 2011-11-02
  • 打赏
  • 举报
回复
可以用递归来实现
对于给定长度n,先计算从1->n-1各有多少可能:C(26,1)。。。C(26,n-1);
然后根据首字母,计算从a到该字母之间的所有n个长度,a开头为C(25,n),b开头为C(24,n),然后按顺序计算下去就可以了
qq120848369 2011-11-02
  • 打赏
  • 举报
回复
参考:《编程之美》

大体思路就是:对于一个字符串acb,它是3位串,所以1位串[a,z]2位串[ab,yz]的个数先加上。 然后,先看a,没东西算,再看c,有的算,从[a,c)的2位串有2*26种,累计上。 然后看b,发现b是最后一个字符,直接算[a,b]有2个。 计算完毕。

这是第(26)+(25+24+23+...1)+(2*26)+(2)个串。

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧