//字典序问题。在数据加密和数据压缩中常需要对特殊的字符串进行编码。
//给定的字母表A由26个小写字母组成。该字母表产生的升序字符串中字母
//从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1次。
//例如,a,b,ab,bc,xyz等字符串都是升序字符串。
//给定的字母表A由26个小写字母组成。该字母表产生的升序字符串中字母
//从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1次。
//例如,a,b,ab,bc,xyz等字符串都是升序字符串。
//现在对字母表中产生的所有长度不超过6的升序字符串,计算它在字典中的编码。
#include<stdio.h>
#include<string.h>
int f(int ch,int len){
if(len==1)
return 1;
else{
int sum=0;
int j;
for(j=ch+1;j<27-len;j++){
sum=sum+f(j,len-1);
}
return sum;
}
}
int g(int len){
int ch;
int sum=0;
for(ch=0;ch<=26-len;ch++){
sum=sum+f(ch,len);
}
return sum;
}
int main(){
int pos=0;
char *str="abcd";
int ch,i,j,k;
for(i=1;i<strlen(str);i++)
pos=pos+g(i);
for(ch=0;ch<str[0]-'a';i++)
pos=pos+f(ch,strlen(str));
for(i=1;i<strlen(str);i++)
for(ch=str[i-1]-'a'+1;ch<str[i]-'a';ch++)
pos+=f(ch,strlen(str)-i);
printf("位置是%d\n",pos+1);
return 0;
}