问题

  字典序问题,给定一个长度不超过7的小写字母升序字符串(字符串中的字符相对顺序和字母表中的顺序一致),迅速计算出在字典中的编码,字典如:

    1   2   3   ...     26  27  28  ...

    a   b   c   ...      z    ab  ac  ...

代码

#define _CRT_SECURE_NO_WARNINGS
#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);
        }
    }
    printf("sum :%d \n", sum);
    return sum;
}

int countPut(char a[]) {
    int i, j, count, n, length;
    int sum = 0; //字典序值变量
    int k = strlen(a); //字符长度
    /*
     abc
     0  1  2
     a  b  c
    */
    printf("char a[0]: %c \n", a[0]);

    //计算满n-1层的字典序值(abc为三层 即ab两个字母的情况就为满层)
    for (i = 1; i < k; i++) {
        for (int j = 1; j <= 26; j++) {
            sum += f(j, i);
        }
    }

    //计算数组第一位的值a[0] 即最高位
    //通过ASCII码计算出值(a为97) a-z >> 1-26
    int h = a[0] - 96;
    for (int i = 1; i < h; i++) {
        sum += f(i, k);
    }

    count = h;
    //k 字符长度
    for (i = 1; i < k; i++) {
        //逐一计算char a[n] 中的1到k 中每一个字母的字典序值
        n = a[i] - 96;
        length = k - i;
        for (j = count + 1; j < n; j++) {
            sum += f(j, length);
        }
        count = n;
    }
    return sum + 1;
}

int main()
{
    char a[7];
    long long x;
    x = 0;
    scanf("%s", &a);
    x = countPut(a);
    printf("%d\n", x);
    return 0;
}

样例

输入

  • 一个字符串
ab

输出

  • 一个整数,表示该字符串在字典序中的序号
27
最后修改:2022 年 09 月 19 日
如果觉得我的文章对你有用,请随意赞赏