问题
字典序问题,给定一个长度不超过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