1 solutions

  • 0
    @ 2024-11-6 22:33:53

    题目描述

    给定一个加密字符串 SS,需要按照以下规则对其进行解密并输出。

    解密规则:

    1. 字母字符:若当前字符为字母 A-Za-z,无需解密,原样输出。

    2. 括号表达式:若当前字符为 '(',则其后会跟两个正整数 xy,以及一个右括号 ')',其中正整数 xy 之间以逗号分隔。你需要从当前解密串的末尾向前数第 x 个字符开始,复制长度为 y 的字符串并追加到解密结果中。

    需要注意的是,如果 y 大于可复制的字符数,则需要多次复制,直到复制满 y 个字符。复制过程中,解密串的长度会增加,这会影响后续的复制操作。

    思路

    模拟,枚举原始字符串碰到括号进行substr操作即可。

    具体模拟步骤

    1. 逐字符处理:遍历输入字符串,对于每个字符,按照规则处理。

    2. 解析括号表达式:当遇到 '(' 时,需要解析出两个整数 xy

    3. 处理复制操作

      • 计算复制的起始位置:pos = res.length() - x
      • 复制长度为 y 的字符串,如果剩余可复制的字符数不足 y,则需要多次复制,直到复制满 y 个字符。
    4. 更新解密结果:在复制过程中,解密结果 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

    2024.11.6-秋招(留学生)-第2题-解密字符串

    Information

    ID
    174
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    3
    Tags
    # Submissions
    90
    Accepted
    31
    Uploaded By