• 字典序问题 算法实现题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;
    }
    
  • 相关阅读:
    Java MyBatis 插入数据库返回主键
    FISCO-BCOS平台共识
    分布式一致性协议介绍(Paxos、Raft)
    分布式问题分析
    分布式基础知识
    比特币编译(Ubuntu 16.04)
    比特币源代码分析(1)
    c++中的多线程
    剑指offer中数据结构与算法部分学习
    基础的语法知识汇总
  • 原文地址:https://www.cnblogs.com/alking1001/p/13346692.html
Copyright © 2020-2023  润新知