【问题描述】
在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表A由26个小写字母组成。该字母表产生的升序字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1次。例如,a,b,ab,bc,xyz等字符串都是升序字符串。现在对字母表中产生的所有长度不超过6的升序字符串,计算它在字典中的编码。
【样例输入】
2
a
b
【样例输出】
1
2
代码:
#include<stdio.h>
#include<string.h>
int combine(int m,int n)
{//排列组合求值
int sum1=1;
int sum2=1;
if(m>n)
return 0;
if(2*m>n)
m=n-m;
for(int i=1;i<=m;i++){
sum1*=n-i+1;
sum2*=i;
}
return sum1/sum2;
}
int count(char str[],int low)
{
int sum=0;
char high=str[0];
int len=strlen(str);
int temp=low;
for(int k=1;k<=high-'a'-low;k++)
{//长度和字符串相等的,在首字母之前的
sum+=combine(len-1,26-temp-k);
}
if(len>1)
{
sum+=count(&str[1],high-'a'+1); //递归,长度减一
}
return sum;
}
int main()
{
int n;
printf("请输入字符串的个数:\n");
scanf("%d",&n);
while(n--){
printf("请输入字符串:");
char str[10];
scanf("%s",str);
int sum=0;
for(int i=1;i<strlen(str);i++){ //长度小于字符串长度的值
sum+=combine(i,26);
}
printf("该字符串的编码为:%d\n",sum+count(str,0)+1);
}
}