[蓝桥杯 2020 省 AB1] 解码 的题解
记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。
在解题之前提交题解的代码会导致封禁。
作者:
概述
本题要求根据简写规则还原原始字符串。核心解法是顺序扫描简写字符串,若当前字符为字母,则检查后一位是否为数字,若为数字则将该字母重复对应次数输出,否则输出一次。
分析
核心观察
简写规则中,字母后面可能跟一个数字( 到
)表示该字母重复的次数,若不跟数字则表示只出现一次。只需逐个字符解析,根据字母后的数字决定输出次数即可。
思路
设简写字符串为 s,长度不超过 。遍历每个字符
s[i],当 s[i] 是字母时,查看 s[i+1] 是否存在且为数字。若存在数字,则将该字母连续输出 s[i+1]-'0' 次,并跳过该数字(即 i++);若不存在数字或后一位不是数字,则直接输出该字母一次。数字字符本身不作为输出内容,仅用于控制重复次数。
由于题目保证连续相同字母不会超过 个,因此数字只占一位,无需处理多位数字的情况。
具体示例
输入 H3el5o2:
H后跟3,输出H三次;e后跟l(非数字),输出e一次;l后跟5,输出l五次;o后跟2,输出o两次。 拼接得到HHHellllloo。
算法步骤
- 读取简写字符串
s。 - 初始化空结果字符串
ans。 - 遍历
s的索引i从到
:
- 若
s[i]是数字,则跳过(数字已在前面处理)。 - 否则(
s[i]是字母):- 若
i+1 < len且s[i+1]是数字,则令cnt = s[i+1] - '0',将s[i]重复cnt次加入ans,并i++(跳过数字); - 否则将
s[i]一次加入ans。
- 若
- 若
- 输出
ans。
复杂度分析
- 时间:
,其中
为简写字符串长度。
- 空间:
,用于存储输出结果。
实现注意事项
- 输入字符串由大小写字母和数字组成,数字仅为
到
。
- 遍历时需注意边界,确保访问
s[i+1]不会越界。 - 数字字符不要输出,只作为重复次数。
- 原始串长度可能超过简写串长度,但输出结果可能很长(最长可达
),使用字符串拼接即可。
源代码
#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))
评论