计算机算法设计与分析(第5版)1—2 字典序问题

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

#include
#include
#include
typedef struct{
	char ch[10];
	int length;
}SString;
int f(int i,int k)
{//第i个字符打头的长度不超过k的升序字符串个数是f(i,k)
	int c=0;
	if(k==1)
		return 1;
	if(k==2)
		return 26-i;
	for(int j=i+1;j<=26;j++)
	{
		c+=f(j,k-1);
	}
	return c;
}
int g(int k)
{//长度不超过k的升序字符串总个数为g(k)
	int i;
	int c=0;
	if(k==1)
	{
		for(i=1;i<=26;i++)
			c+=f(i,1);
		return c;
	}
	if(k==2)
	{
		for(i=1;i<=26;i++)
			c+=f(i,2);
		return c;
	}
	for(i=1;i<=26;i++)
		c+=f(i,k);
	return c;
}
int one(char o[10],char A[28])
{
	int i;
	for(i=1;i<=26;i++)
		if(o[0]==A[i])
			break;
	return i;
}
int two(char t[10],char A[28])
{
	int i,j,k;
	int c=g(1);
	for(i=1;i<=26;i++)
		if(t[0]==A[i])
			break;
	for(j=1;j6)
				printf("worry");
			switch(ST[i].length)
			{
			case 1:
				answear=one(ST[i].ch,A);
				break;
			case 2:
				answear=two(ST[i].ch,A);
				break;
			case 3:
				answear=three(ST[i].ch,A);
				break;
			case 4:
				answear=four(ST[i].ch,A);
				break;
			case 5:
				answear=five(ST[i].ch,A);
				break;
			case 6:
				answear=six(ST[i].ch,A);
				break;
			}
			printf("%d\n",answear);
	}
	system("pause");
}

 

你可能感兴趣的:(计算机算法设计与分析(第5版)1—2 字典序问题)