[蓝桥杯 2020 省 AB1] 解码 的题解


记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。

作者: admin

概述

本题要求根据简写规则还原原始字符串。核心解法是顺序扫描简写字符串,若当前字符为字母,则检查后一位是否为数字,若为数字则将该字母重复对应次数输出,否则输出一次。

分析
核心观察

简写规则中,字母后面可能跟一个数字(1 到 9)表示该字母重复的次数,若不跟数字则表示只出现一次。只需逐个字符解析,根据字母后的数字决定输出次数即可。

思路

设简写字符串为 s,长度不超过 100。遍历每个字符 s[i],当 s[i] 是字母时,查看 s[i+1] 是否存在且为数字。若存在数字,则将该字母连续输出 s[i+1]-'0' 次,并跳过该数字(即 i++);若不存在数字或后一位不是数字,则直接输出该字母一次。数字字符本身不作为输出内容,仅用于控制重复次数。

由于题目保证连续相同字母不会超过 9 个,因此数字只占一位,无需处理多位数字的情况。

具体示例

输入 H3el5o2:

  • H 后跟 3,输出 H 三次;
  • e 后跟 l(非数字),输出 e 一次;
  • l 后跟 5,输出 l 五次;
  • o 后跟 2,输出 o 两次。 拼接得到 HHHellllloo。
算法步骤
  1. 读取简写字符串 s。
  2. 初始化空结果字符串 ans。
  3. 遍历 s 的索引 i 从 0 到 len-1:
    • 若 s[i] 是数字,则跳过(数字已在前面处理)。
    • 否则(s[i] 是字母):
      • 若 i+1 < len 且 s[i+1] 是数字,则令 cnt = s[i+1] - '0',将 s[i] 重复 cnt 次加入 ans,并 i++(跳过数字);
      • 否则将 s[i] 一次加入 ans。
  4. 输出 ans。
复杂度分析
  • 时间:O(L),其中 L 为简写字符串长度。
  • 空间:O(L),用于存储输出结果。
实现注意事项
  • 输入字符串由大小写字母和数字组成,数字仅为 1 到 9。
  • 遍历时需注意边界,确保访问 s[i+1] 不会越界。
  • 数字字符不要输出,只作为重复次数。
  • 原始串长度可能超过简写串长度,但输出结果可能很长(最长可达 100 \times 9 = 900),使用字符串拼接即可。
源代码
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s;
    cin >> s;
    string ans;
    for (int i = 0; i < (int)s.size(); ++i) {
        if (isdigit(s[i])) {
            continue;
        }
        if (i + 1 < (int)s.size() && isdigit(s[i + 1])) {
            int cnt = s[i + 1] - '0';
            for (int j = 0; j < cnt; ++j) {
                ans.push_back(s[i]);
            }
            ++i; // 跳过数字
        } else {
            ans.push_back(s[i]);
        }
    }
    cout << ans << endl;
    return 0;
}
s = input()
ans = []
i = 0
while i < len(s):
    if s[i].isdigit():
        i += 1
        continue
    if i + 1 < len(s) and s[i + 1].isdigit():
        cnt = int(s[i + 1])
        ans.append(s[i] * cnt)
        i += 2
    else:
        ans.append(s[i])
        i += 1
print(''.join(ans))

评论

目前没有评论。