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

Posted alking1001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字典序问题 算法实现题1-2相关的知识,希望对你有一定的参考价值。

字典序问题 算法实现题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
",pos+1);
	}
    return 0;
}

以上是关于字典序问题 算法实现题1-2的主要内容,如果未能解决你的问题,请参考以下文章

算法题7寻找下一个排列

算法题-第K个小子串

算法设计之字典序

算法设计之字典序

算法设计之字典序

算法初级面试题07——前缀树应用介绍和证明贪心策略拼接字符串得到最低字典序切金条问题项目收益最大化问题随时取中位数宣讲会安排