华为机试题 HJ36题解 | #字符串加密#
字符串加密
https://www.nowcoder.com/practice/e4af1fe682b54459b2a211df91a91cf3
#include <cctype>
#include <iostream>
#include <string>
#include <algorithm>
#include <unordered_map>
#include <map>
using namespace std;
// 对字符串mingwen按照key进行加密,返回加密后的字符串
string Decrypt(string &key, const std::string &mingwen)
{
string newKey = "";
string miwen = "";
// 将密钥key全部先转成小写字母
std::transform(key.begin(), key.end(), key.begin(), ::tolower);
unordered_map<char, int> chMap;
char chStart = 'a';
// 字母对照表map
map<char, char> matchMap;
for (auto ch : key) {
if (isalpha(ch) && chMap.count(ch) == 0) {
chMap[ch]++;
newKey += ch;
matchMap[chStart++] = ch;
}
}
// 遍历字母表,如果不在key中则加入newKey之后,得到新字母表
for (char ch1 = 'a'; ch1 <= 'z'; ch1++) {
if (chMap.count(ch1) == 0) {
newKey += ch1;
matchMap[chStart++] = ch1;
}
}
// 遍历明文字符串
for (auto ch2 : mingwen) {
bool isUpper = (ch2 >= 'A' && ch2 <= 'Z');
char ch = ch2;
if (isUpper) {
ch = ::tolower(ch2);
}
// 从字典字母对照表中查找,如果找到,则替换成对应的字母
auto jt = matchMap.find(ch);
if (jt != matchMap.end()) {
// 注意:明文中的字母大小写不变
if (isUpper) {
miwen += ::toupper(jt->second);
} else {
miwen += jt->second;
}
} else {
// 没找到,比如空格或者数字等非字母的,直接加上本身值,不变
miwen += ch2;
}
}
return miwen;
}
int main() {
std::string key, mingwen;
// while (cin >> key >> mingwen) { // 注意 while 处理多个 case
// cout << Decrypt(key, mingwen) << std::endl;
// }
while (getline(cin, key)) {
getline(cin, mingwen);
std::cout << Decrypt(key, mingwen) << std::endl;
}
return 0;
}

