码迷,mamicode.com
首页 > 编程语言 > 详细

字典序问题 算法实现题1-2

时间:2020-07-20 22:57:24      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:设计   出现   name   names   table   loading   组成   image   c++   

字典序问题 算法实现题1-2

题意

《计算机算法设计与分析》第8页。

在数据加密和数据压缩中需要对特殊的字符串进行编码。给定的字母表由26个小写字母组成。该字母表产生的升序字符串是指字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1次。例如,a,b,ab,bc, xyz等都是升序字符串。

他们有对应的序号:

1 2 …… 26 27 28 ……
a b …… z ab ac ……

题解思路

技术图片

代码实现

#include<bits/stdc++.h>
using namespace std; 
const int MAXN = 26;
const int MAXL = 6;
int ff[MAXN+1][MAXL+1];
int gg[MAXL+1];
//多加了一个记忆化 
int f(int ch,int len)
{
    int index=0;
    if(ff[ch][len]!=0)
		return ff[ch][len];
    if(len==1)
        return ff[ch][1] = 1;
    for(int i=ch+1; i<=27-len; i++)
        index+=f(i,len-1);
    return index;
}
int g(int len)
{
    int index=0;
    if(gg[len]!=0)
    	return gg[len];
    for(int ch=0;ch<=26-len;ch++)
        index+=f(ch,len);
    return index;
}
 
int main()    
{
    int i,k;
    int ch;
    char str[7];
    //先进行初始化 
    fill(ff[0], ff[0]+MAXN*MAXL, 0);
    fill(gg, gg+MAXL, 0); 
    while(scanf("%s", str)!=EOF){
	    int pos=0;
	    for(i=1;i<strlen(str);i++)
	        pos+=g(i);
	    for(ch=0;ch<str[0]-‘a‘;ch++)  
	        pos+=f(ch,strlen(str));
	    for(k=1; k<strlen(str); k++)
	        for(ch=str[k-1]-‘a‘+1; ch<str[k]-‘a‘; ch++)
	            pos+=f(ch,strlen(str)-k);
	    printf("位置是:%d\n",pos+1);
	}
    return 0;
}

字典序问题 算法实现题1-2

标签:设计   出现   name   names   table   loading   组成   image   c++   

原文地址:https://www.cnblogs.com/alking1001/p/13346692.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!