字典序问题

来源:互联网 发布:steam连不上网络 编辑:程序博客网 时间:2024/06/08 08:59

问题描述:在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表A由26个小写字母组成,即A={a,b,...,z}。该字母表产生的升序字符串是指字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1次。例如,a,b,ab,bc,xyz等字符串都是升序字符串。现在对字母表A产生的所有长度不超过6的升序字符串按照字典序排列并编码如下。

1

2

26

27

28

a

B

z

ab

ac

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

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

思路:假设bhkp,求这个字符串的编码。分以下两步:

(1)bhkp是长度为4的字符串,要求这个字符串的编码,需要求出字符串长度为1、2、3的串的个数,可以写一个函数f(k);

(2)再求以哪个字母打头,长度为几的串的个数,这里就是以b打头,长度为4的串的个数,也可以写一个函数g(i,k);

注:上面的k指的是字符串的长度。

【代码】

#include<stdio.h>#include<string.h>int g(char ch,int len){int sum=0;char i;if(len==1)return 1;else{for(i=ch+1;i<='z'-len+1;i++)sum+=g(i,len-1);return sum;}}int f(int len){char i;int sum;sum=0;for(i='a';i<='z'-len+1;i++)sum+=g(i,len);return sum;}int main(){char *str="bhkp";int len,count=0;int i,j;char chb,ch;len=strlen(str);for(i=1;i<len;i++)count+=f(i);for(i=0;i<len;i++){if(i==0)chb='a';elsechb=str[i-1]+1;for(ch=chb;ch<=str[i]-1;ch++)count+=g(ch,len-i); }  printf("%d",count+1);return 0; } 


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 衣服买来有味道怎么办 热羊奶糊锅怎么办 山姆会员亲友卡怎么办 门面门口修路房租怎么办 快手直播不推送怎么办 小孩出豆子发热怎么办 嘴巴边长痘痘怎么办 种四天豆子没出怎么办 吃了豆子放屁怎么办 ios11软件不兼容怎么办 手机安装不上怎么办 opp0商店没有了怎么办 华硕打不开机怎么办 飞利浦电视待机打不开怎么办 微信支付扫码牌怎么办 微信付款没扣钱怎么办 移动充值卡有效期到了怎么办 联华提货券过期怎么办 狗吃了西红柿怎么办 加盟总店关了怎么办 欧亚超市购物卡怎么办 欠招行信用卡一万多逾期怎么办 白条取现失败怎么办 啤酒喝醉了难受怎么办 喝啤酒喝醉头疼怎么办 运动鞋鞋子大了怎么办 运动鞋买大一号怎么办 跑鞋买大了怎么办 鞋子大一个手指怎么办 一体式手机死机怎么办 ivvi手机声音小怎么办 单位欠缴社保怎么办 哆点错误代码1怎么办 忘记密码怎么办简单一点 智校园忘记密码怎么办 wps图片显示空白怎么办 dr.com闪退怎么办 联想笔记本连不上无线网络怎么办 长时间不用电池休眠怎么办? 校园电信卡欠费怎么办 校园联通卡欠费怎么办