华为机试题 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; }