题目描述
给定一段“密文”字符串 s,其中字符都是经过“密码本”映射的,现需要将“密文”解密并输出。
映射的规则('a' ~ 'i')分别用('1' ~ '9')表示;('j' ~ 'z')分别用("10*" ~ "26*")表示。
约束:映射始终唯一。
输入描述
“密文”字符串
输出描述
明文字符串
备注
翻译后的文本长度在100以内
用例
输入 | 20*19*20* |
输出 | tst |
说明 | 无 |
题目解析
本题有多种解题思路,我的思路是利用字符串替换操作。
即将如下密文和明文进行按照顺序依次映射替换
- "26*" → "z"
- "25*" → "y"
- …
- "10*" → "j"
- "9" → "i"
- …
- "1" → "a"
这里优先将从“26*” ~ "10*" 开始映射替换,比如题目用例:
20*19*20*
如果优先进行 "1" ~ “9” 密文的映射替换,则会产生错误答案。
更多实现细节,请看代码。
JS算法源码
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
// 输入处理
void (async function () {
let s = await readline();
for (let i = 26; i >= 1; i--) {
const key = i + (i > 9 ? "*" : "");
const val = String.fromCharCode(97 + i - 1);
s = s.replaceAll(key, val);
}
console.log(s);
})();
Java算法源码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
for (int i = 26; i >= 1; i--) {
String key = i + (i > 9 ? "\*" : "");
String val = String.valueOf((char) ('a' + i - 1));
s = s.replaceAll(key, val);
}
System.out.println(s);
}
}
Python算法源码
# 输入获取
s = input()
for i in range(26, 0, -1):
key = str(i)
if i > 9:
key += "*"
val = chr(97 + i - 1)
s = s.replace(key, val)
print(s)
C算法源码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* replace(char* s, char* old, char* new) {
char* sub = strstr(s, old);
if(sub == NULL) {
return s;
}
char* res = (char*) calloc(100, sizeof(char));
while (sub != NULL) {
sub[0] = '