字典序问题_在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表 a 由 26 个-程序员宅基地

技术标签: 算法小练  算法  计算机算法分析与设计  在数据加密和数据压缩中常需要对特殊的字符  字典序问题  字符串编码  排列组合  

在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表A26个小写字母组成。该字母表产生的升序字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1次。例如,a,b,ab,bc,xyz等字符串都是升序字符串。现在对字母表中产生的所有长度不超过6的升序字符串,计算它在字典中的编码。

a

b

c

ab

ac

1

2

3

27

28

 

样例输入:

 2

 a

 b

样例输出:

 1

 2 
解法1:

由题意可知字符串对应的序号就是其从小到大排列组合的位置,因为字符串是升序排列,所以以第i个字母开头长度为k的字符串的数量f(i,k)=sumj=i+1:26(f(j,k-1));因此要想求得字符串的位置,需要求出其前面有多少字符串,首先长度小于给出字符串长度k的所有字符串,第二,所有开头字母小于给出字符串开头字母并且长度为k的字符串数量,最后还有开头字母相等长度相等但是后面字母小于已给字符串字母的所有字符串。


#include<stdio.h> 
#include<string.h>

int f(int i,int k){
	int j;
	int sum=0;
	if(k==1){
		return 1;
	}else{
		for(j=i+1;j<=26;j++){
			sum+=f(j,k-1);
		} 
	}
	return sum;
}//第i个字母开头长度为k的数量 
int ca(char a[]){
	int i,j,count,n,length;
	int sum=0;
	int k=strlen(a);
	for(i=1;i<k;i++){
		for(int j=1;j<=26;j++){
			sum+=f(j,i);
		}	 
	} // 该字符串的位置就是小于k长度的数量,
	int h=a[0]-'a'+1;
	for(int i=1;i<h;i++){
		sum+=f(i,k); 
	}//加上小于开头字母的长度为k的数量,
	
	count = h;
	for(i=1;i<k;i++){
		n= a[i]-'a'+1;
		length=k-i;
		for(j=count+1;j<n;j++){
			sum+=f(j,length); 
		} 
		count=n;	
	}//再加上字符串中字母与其后面字母之间字母开头的k-i长度字符串的数量 
	return sum+1;
}
int main()
{
	int n;
	char a[30];
	long long x;
	scanf("%d",&n);
	getchar();
	while(n--){
		x=0;
		gets(a);
		x=ca(a);
		printf("%d\n",x);
	}
	return 0;
}


解法2:

使用排列组合思想,将每个字符串长度为k即为使用字母将这k个空位进行填充,一共有26-j个字母可供选择,所以可能种类数量为从26-j个字母中随便选择k个。函数C就是求排列组合数量。

因此

①将长度小于已给字符串长度的所有字符串数量算出。也就是长度从1len-1,可选字母为26个字母都可以。

②将长度等于已给字符串长度len的字符串数量,而此时也要分解:首先以小于开头字母的字母开头的长度为len的所有字符串都满足条件,所以实际字符串开头字母从a开始小于已给字符串开头字母,实际求取字符串长度为len;其次,从第二位开始,实际求取字符串开头字母应该大于第一位字母小于后一位字母,实际长度为len-1;依次类推知道实际字符串长度为1。

最后sum再加上1(本身位置)即为最终结果。


#include <stdio.h>
#include<string.h>

int C(int x,int y)
{
	int i=y;
	int temp=0;
	int a,b;
	a=b=1;
	while(i && x)
	{
		a*=x;
		i--;
		x--;
	}
	while(y)
	{
		b*=y;
		y--;
	}
	temp=a/b;
	return temp;
}
//C(x,y);是一个上层为y,下层为x的排列组合,x是指填充字符串的字母可能数量,y是指字符串的长度。 
int main()
{
	int n,i,j,start,sum,len;
	char a[26];
	while(~scanf("%d",&n))
	{
		getchar();
		while(n--){
			sum=0;
			start=1;
			gets(a);
			len=strlen(a);
			for(i=1;i<len;i++)
				sum+=C(26,i);
			//传递参数中i为字符串长度,此时每个字符串的可选择字母为26个字母都可以。 26不做变化 
			//长度小于已知字符串长度的所有数量。
			for(j=len;j>0;j--){
				//控制实际求取字符串的长度 
				for(i=start;i<a[len-j]-'a'+1;i++){
					//控制实际求取字符串的开头字母 
					sum+=C(26-i,j-1);
				// 第一个参数:因为字符串为递增,
					//所以字符串开头之后的位置填充(字母种类)为(总字母数量26)减去(开头字母之前的字母数量) 
				//第二个参数:因为开头字母已经人为确定,
					//所以此时实际应求数量的字符串长度为i-1(即应该填充的字母数量)	
				}
				start=a[len-j]-'a'+2;
				//因为实际字符数量求取过程已经完成,所以要进行下一位求取;
			//因字符串为递增,所以可能情况为之前字母加1;而且要小于之后字母	
			}
			printf("%d\n",sum+1);
		}
	}
	return 0;
}



 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LDUtyk/article/details/52493315

智能推荐

在移动硬盘中安装win10和macos双系统-程序员宅基地

文章浏览阅读1.1k次,点赞22次,收藏23次。本文通过在SSD移动硬盘中安装win10和macos双系统,实现操作系统随身携带小慢哥的原创文章,欢迎转载目录 目标 准备工作 Step1. 清空分区,转换为GPT Step2. 安装win10 Step3. 压缩win10分区容量 Step4. 创建2个分区 Step5. 将bootcamp驱动放置到exFAT分区中 Step6. 将macos分区..._mac移动硬盘装双机系统

TransmittableThreadLocal解决线程池本地变量问题,原来我一直理解错了-程序员宅基地

文章浏览阅读14次。theme: cyanosishighlight: a11y-dark前言自从上次TransmittableThreadLocal框架作者评论我之后,我重新去看了下源码,终于在这个周天,我才把TransmittableThreadLocal解决线程池变量丢失的问题搞明白,而且发现我之前的认识有问题,久久孩子我之前是觉得,InheritableThreadLocal解决父子线...

Exchange 2016部署实施案例篇-03.Exchange部署篇(上)-程序员宅基地

文章浏览阅读366次。  距离上一篇《Exchange 2016部署实施案例篇-02.活动目录部署篇》博文更新已经过去快一周了,最近一直在忙项目上的事情和软考,整的真心有点身心俱疲啊,最近看了下上一篇博文不知道为什么访问量一直上不去,真心有点心寒啊。希望大家能多多提出宝贵意见,看看如何能让访问量上去。  废话就不多说了,开始今天的话题,Exchange的部署篇,我原定计划是把部署篇分上、下2个篇幅来写的,但最近发现好..._解决exchange2016部署先决条件

[译]使用MVI打造响应式APP(四):独立性UI组件-程序员宅基地

文章浏览阅读130次。原文:REACTIVE APPS WITH MODEL-VIEW-INTENT - PART4 - INDEPENDENT UI COMPONENTS作者:Hannes Dorfmann译者:却把清梅嗅这篇博客中,我们将针对如何 如何构建独立组件 进行探讨,我将阐述为什么在我看来 父子关系会导致坏味道的代码,以及为何这种关系是没有意义的。有这样一个问题时不时涌现在我的脑海中—— MVI...

tensorflow经过卷积及池化层后特征图的大小计算_池化层后特征图尺寸-程序员宅基地

文章浏览阅读662次。https://blog.csdn.net/qq_32466233/article/details/81075288_池化层后特征图尺寸

使用vue-echarts异步数据加载,不能重新渲染页面问题。_vue echart初始化渲染过后无法重新渲染-程序员宅基地

文章浏览阅读3.3k次。一、问题说明我是用的是官方示例中的这个饼状图。结果在应用到项目中后发现利用axios请求到的数据无法渲染到页面中去。并且其中value值已经改变。二、解决办法用$set改变value的值,并且重新绘制一遍表格。$set是全局 Vue.set 的别名。$set用法:向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。它必须用于向响应式对象上添加新属性,因为..._vue echart初始化渲染过后无法重新渲染

随便推点

Dev-C++ “to_string is not a member of std” error- 已解决_devc++ [error] 'to_string' is not a member of 'std-程序员宅基地

文章浏览阅读3.7k次。今天在用Dev-C++ 的时候遇到一个错误“to_string is not a member of std” error解决方法:设置编译语言为ISO C++11 在菜单栏的Tool -> Compiler Option_devc++ [error] 'to_string' is not a member of 'std

python的10款最好的IDE_pydea兼容的-程序员宅基地

文章浏览阅读1.1k次。Python 非常易学,强大的编程语言。Python 包括高效高级的数据结构,提供简单且高效的面向对象编程。Python 的学习过程少不了 IDE 或者代码编辑器,或者集成的开发编辑器(IDE)。这些 Python 开发工具帮助开发者加快使用 Python 开发的速度,提高效率。高效的代码编辑器或者 IDE 应该会提供插件,工具等能帮助开发者高效开发的特性。这篇文章收集了一些对开发者非常有_pydea兼容的

python translate函数_Python:内置函数makestrans()、translate()-程序员宅基地

文章浏览阅读287次。一、makestrans()格式: str.maketrans(intab,outtab);功能:用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。注:两个字符串的长度必须相同,为一一对应的关系。注:Python3.6中已经没有string.maketrans()了,取而代之的是内建函数:bytearray...._python maketrance

Set集合详解-程序员宅基地

文章浏览阅读5.7k次,点赞9次,收藏14次。set集合的简介,它的特点和遍历方式。介绍了HashSet重复元素存储底层原理,LinkedHashSet,TreeSet排序方法,SortedSet获取集合值的方法_set集合

详解智慧城市排水管理系统整体方案_污水处理智慧管理系统案列-程序员宅基地

文章浏览阅读3.6k次,点赞3次,收藏29次。随着城市规模的不断扩大和现代化程度的日益提高,城市排水管网越来越复杂,一些城市相继发生大雨内涝、管线泄漏爆炸、路面塌陷等事件,严重影响了人民群众生命财产安全和城市运行秩序。因此,摸清排水管网设施资产家底、建立排水管网地理信息系统,用现代化的技术手段对排水系统进行科学管理显得迫在眉睫。以时空信息为基础,充分利用感知监测网、物联网、云计算、移动互联网、工业控制和水力模型等新一代信息技术,全方位感..._污水处理智慧管理系统案列

详解NTFS文件系统_ntfs文件系统中,磁盘上的所有数据包括源文件都是以什么的形式存储-程序员宅基地

文章浏览阅读5.7k次,点赞4次,收藏13次。上篇在详解FAT32文件系统中介绍了FAT32文件系统存储数据的原理,这篇就来介绍下NTFS文件系统。NTFS、用过Windows系统的人都知道,它是一个很强大的文件系统,支持的功能很多,存储的原理也很复杂。目前绝大多数Windows用户都是使用NTFS文件系统,它主要以安全性和稳定性而闻名,下面是它的一些主要特点。安全性高:NTFS支持基于文件或目录的ACL,并且支持加密文件系统(E_ntfs文件系统中,磁盘上的所有数据包括源文件都是以什么的形式存储

推荐文章

热门文章

相关标签