字典序问题

来源:互联网 发布:单片机编程基础知识 编辑:程序博客网 时间:2024/05/01 05:25

问题描述:在数据加密和数据压缩中常需要对特殊的字符串进行编码。

给定的字母表A由26个小写英文字母组成,即A={a,b,c,...,z}。

该字母表产生的升序字符串是指字符串字母从左到右出现的次序与字母在字母表

中出现的次序相同,且每个字符最多出现1次。

例如,a,b,ab,bc,xyz等字符串都是升序字符串。

现在对字母表A产生的所有长度不超过6的升序字符串按照字典序排列并编码如下:

 

       12 ...      26 27      28 51

       ab ...      z  ab      acaz

对任意长度不超过6的升序字符串,迅速计算出它在上述字典中的编码。

 

 

    算法设计:对任意长度不超过6的升序字符串,计算出它在上述字典中的编码。

思路:像abcd, 我们给他们编上位置代号:1234,在1的位置进制是26,在2的位置进制是25,以此递减,而且在2的位置少了a, 在3的位置少了a, b,以此类减。可以看出进制和字母在各个位置上的实际大小跟位置有关。这样就可以做了,先求出最后面字母的大小(因为不用乘上进制),再求前面的字母大小。(重要就是逆着求)

代码如下:

#include<iostream.h>

void main()

{

       chara[6];

       cout<<"请输入字母的个数(下标从0开始,所以0代表一个字母):"<<endl;

       inti;

       cin>>i;

       cout<<"请输入字母:"<<endl;

       for(intj=0;j<=i;j++)

              cin>>a[j];

       intsum=0;

       sum=a[i]-96-i;//先求最后一个字母的大小

       for(intk=0;k<=i-1;k++)

       {

sum+=(a[k]-96-k)*(26-k);

//(a[k]-96-k)求出字母在该位置的实际大小(例如在3 上的//c,c-96-2=1;(96ASCLL码有关,大家自己查) c-96=3,3-2=1,所以在3位置上,c //的实际大小是1(减去2是因为下标是从0开始,大家可以改成从1开始))

       }

       cout<<"该序列的大小为:"<<sum<<endl;

}


0 1
原创粉丝点击