当前位置:   article > 正文

【哈希表】 密码解密_给定一段"密文"字符串s,其中字符都是经过"密码本"映射的,现需要将"密文"解密并且

给定一段"密文"字符串s,其中字符都是经过"密码本"映射的,现需要将"密文"解密并且

题目描述

给定一段"密文"字符串s,其中字符都是经过"密码本"映射的,现需要将"密文"解密并且输出。

映射的规则 :"a-i"分别用"1-9"表示,"j-z" 分别用"10*-26*"表示

约束:映射始终唯一

输入描述

“密文”字符串

输出描述

明文字符串

补充说明

翻译后的文本的长度在100以内

示例一

输入

20*19*20*

输出

tst

解题思路

本题需要分两步走:对原字符串的预处理以及元素映射关系。

元素映射

涉及元素一一映射的关系,构建从数字到字母的映射这件事,很容易想到应该使用哈希表来解决

两位数的处理

另外,本题所给密码字符串中,两位数(10-26)的后面都会带一个*,而一位数(1-9)的后面不带*,我们必须把这两种情况区分开来。

如果我们从头到尾地遍历原字符串s,每次遇到一个*号,则说明此时*号前面的两个字符需要合并在一起,视为一个两位数来处理。

很显然,只有在遇到*号的时候,才需要去查看刚刚最新遇到的两个数字字符,这是一种后进先出的思路,很显然可以使用栈来处理这个过程。

退出循环后,栈中储存了若干个数字字符串(有一位数也有两位数),再将这些数字字符串传入哈希表中进行从数字到字母的映射,再合并为一个字符串输出即为答案。

代码

  1. #include <iostream>
  2. #include <unordered_map>
  3. #include <stack>
  4. #include <string>
  5. using namespace std;
  6. int main() {
  7. // 构建数字和字母之间的映射关系
  8. unordered_map<string, char> dic;//(1,a)(2,b)
  9. for (int i = 1; i <= 26; i++) {
  10. dic[to_string(i)] = 'a' + i - 1;
  11. }
  12. string s;
  13. cin >> s;
  14. // 构建一个栈
  15. stack<string> stack;
  16. // 遍历s中所有字符
  17. for (char ch : s) {
  18. // 如果是*号,说明*前面的两个数字要合并为一个两位数一起考虑
  19. if (ch == '*') {
  20. // 弹出栈顶两个元素,分别是个位和十位的字符串
  21. // 先弹出个位,再弹出10位
  22. string digit_1 = stack.top();
  23. stack.pop();
  24. string digit_10 = stack.top();
  25. stack.pop();
  26. // 将合并后的两位数重新压回栈顶
  27. stack.push(digit_10 + digit_1);
  28. }
  29. // 如果不是*号,而是数字,则直接入栈
  30. else {
  31. stack.push(string(1, ch));
  32. }
  33. }
  34. // 最后栈中的所有元素即为数字字符串,使用dic进行从数字到字母的映射之后再合并即可
  35. string result = "";
  36. while (!stack.empty()) {
  37. string numStr = stack.top();
  38. stack.pop();
  39. result = dic[numStr] + result;
  40. }
  41. // 输出结果
  42. cout << result << endl;
  43. return 0;
  44. }

时空复杂度

时间复杂度:O(N)。需要一次遍历字符串s

空间复杂度:O(N)。哈希表所占空间,长度为26,可视为常数级别空间;栈所占空间最大为N

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/949370
推荐阅读
相关标签
  

闽ICP备14008679号