字典序问题 算法实现题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;
}