1 solutions
-
0
题目描述
给定一个加密字符串 ,需要按照以下规则对其进行解密并输出。
解密规则:
-
字母字符:若当前字符为字母
A-Z
、a-z
,无需解密,原样输出。 -
括号表达式:若当前字符为
'('
,则其后会跟两个正整数x
、y
,以及一个右括号')'
,其中正整数x
和y
之间以逗号分隔。你需要从当前解密串的末尾向前数第x
个字符开始,复制长度为y
的字符串并追加到解密结果中。
需要注意的是,如果
y
大于可复制的字符数,则需要多次复制,直到复制满y
个字符。复制过程中,解密串的长度会增加,这会影响后续的复制操作。思路
模拟,枚举原始字符串碰到括号进行substr操作即可。
具体模拟步骤
-
逐字符处理:遍历输入字符串,对于每个字符,按照规则处理。
-
解析括号表达式:当遇到
'('
时,需要解析出两个整数x
和y
。 -
处理复制操作:
- 计算复制的起始位置:
pos = res.length() - x
。 - 复制长度为
y
的字符串,如果剩余可复制的字符数不足y
,则需要多次复制,直到复制满y
个字符。
- 计算复制的起始位置:
-
更新解密结果:在复制过程中,解密结果
res
的长度会增加,需要动态更新。
cpp
#include <iostream> #include <string> int main() { std::string s; // 输入的加密字符串 std::getline(std::cin, s); std::string res; // 解密后的结果字符串 for (size_t i = 0; i < s.length(); ++i) { if (s[i] == '(') { // 解析 x 和 y int x = 0, y = 0; ++i; // 跳过 '(' // 解析 x while (s[i] != ',') { x = x * 10 + (s[i] - '0'); ++i; } ++i; // 跳过 ',' // 解析 y while (s[i] != ')') { y = y * 10 + (s[i] - '0'); ++i; } // 进行复制操作 int pos = res.length() - x; // 复制的起始位置 while (y > 0) { int len = std::min((int)res.length() - pos, y); // 本次可复制的长度 res += res.substr(pos, len); // 追加复制的字符串 y -= len; // 更新剩余需要复制的长度 } } else { // 字母字符,直接添加到结果中 res += s[i]; } } // 输出解密后的字符串 std::cout << res << std::endl; return 0; }
python
s = input() res = '' i = 0 while i < len(s): if s[i] == '(': i += 1 # 跳过 '(' x = 0 while s[i] != ',': x = x * 10 + int(s[i]) i += 1 i += 1 # 跳过 ',' y = 0 while s[i] != ')': y = y * 10 + int(s[i]) i += 1 i += 1 # 跳过 ')' pos = len(res) - x # 复制的起始位置 while y > 0: length = min(len(res) - pos, y) # 本次可复制的长度 res += res[pos:pos+length] # 追加复制的字符串 y -= length # 更新剩余需要复制的长度 else: res += s[i] i += 1 print(res)
java
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine(); StringBuilder res = new StringBuilder(); int i = 0; while (i < s.length()) { if (s.charAt(i) == '(') { i++; // 跳过 '(' int x = 0; while (s.charAt(i) != ',') { x = x * 10 + (s.charAt(i) - '0'); i++; } i++; // 跳过 ',' int y = 0; while (s.charAt(i) != ')') { y = y * 10 + (s.charAt(i) - '0'); i++; } i++; // 跳过 ')' int pos = res.length() - x; // 复制的起始位置 while (y > 0) { int len = Math.min(res.length() - pos, y); // 本次可复制的长度 res.append(res.substring(pos, pos + len)); // 追加复制的字符串 y -= len; // 更新剩余需要复制的长度 } } else { res.append(s.charAt(i)); i++; } } System.out.println(res.toString()); } }
-
- 1
Information
- ID
- 174
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 3
- Tags
- # Submissions
- 90
- Accepted
- 31
- Uploaded By