C++ 实现升序字符串编码算法
在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表 A 由 26 个小写英文字母组成 A={‘a’,‘b’,…,‘z’}。该字母表产生的升序字符串是指字符串中字母按照从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现 1 次。例如,‘a’,‘b’,‘ab’,‘bc’,‘xyz’ 等字符串都是升序字符串。现在对字母表 A 产生的所有长度不超过 6 的升序字符串按照字典序排列并编码如下。
1 2 …… 26 27 28 …… a b …… z ab ac ……
对于任意长度不超过 6 的升序字符串,迅速计算出它在上述字典中的编码。
编程任务: 对于给定的长度不超过 6 的升序字符串,编程计算出它在上述字典中的编码。
数据输入: 输入的第一行是一个正整数 k,表示接下来共有 k 行。 接下来的 k 行中,每行给出一个字符串。 每个字符串的长度(所含小写字符的个数)不超过6个。
结果输出: 输出共有 k 行,每行的整数对应于一个字符串的编码。
以下是用C++实现的代码:
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int getAlphabetCode(char c) {
return c - 'a' + 1;
}
int getAscendingStringCode(string s) {
int code = 0;
int n = s.length();
int base = 26;
for (int i = 0; i < n; i++) {
code += getAlphabetCode(s[i]) * pow(base, n - i - 1);
base++;
}
return code;
}
int main() {
int k;
cin >> k;
cin.ignore(); // 忽略第一行的换行符
for (int i = 0; i < k; i++) {
string s;
getline(cin, s);
int code = getAscendingStringCode(s);
cout << code << endl;
}
return 0;
}
该程序首先定义了两个辅助函数:getAlphabetCode 和 getAscendingStringCode。getAlphabetCode 函数用于返回字母在字母表中的编码,从1开始计数。getAscendingStringCode 函数用于计算升序字符串在字典中的编码。
在 main 函数中,首先读取输入的行数 k。然后使用 getline 函数逐行读取输入的字符串,并调用 getAscendingStringCode 函数计算每个字符串的编码,并输出结果。
注意:由于题目要求每个字符串的长度不超过6个字符,因此可以使用 pow 函数来计算每个字母的权重。如果需要处理更长的字符串,可能需要使用其他方法来计算编码。
原文地址: https://www.cveoy.top/t/topic/hnhO 著作权归作者所有。请勿转载和采集!