巅峰赛#24 T1 题解 100% AC
2025-08-25 18:14:28
发布于:江苏
33阅读
0回复
0点赞
题目讲解
题目要求:
我们需要判断一个压缩后的字符串是否被充分压缩。充分压缩的定义是:相邻的两个压缩元素的字符互不相同。也就是说,对于压缩后的字符串中的每一个元素(由字符和长度组成),不能有连续的两个元素具有相同的字符。
输入格式:
- 第一行是一个整数 ,表示压缩后的字符串的元素数量。
- 接下来的 行,每行是一个字符 和一个整数 ,表示第 个压缩元素的字符和长度。
输出格式:
- 如果字符串被充分压缩,输出
Yes
;否则输出No
。
示例分析:
-
示例1:
- 输入:
3 a 1 b 1 c 1
- 解释:三个元素的字符分别是 、、,相邻字符均不相同,因此输出
Yes
。
- 输入:
-
示例2:
- 输入:
3 a 1 a 1 b 1
- 解释:前两个元素的字符都是 ,相邻字符相同,因此输出
No
。
- 输入:
代码讲解
#include <bits/stdc++.h>
using namespace std;
int main() {
int k;
cin >> k; // 读取压缩元素的数量
char p = '\0'; // 初始化前一个字符为空字符
bool flag = 1; // 标记是否充分压缩,初始为 true(充分压缩)
for (int i = 0; i < k; i++) {
char c;
int num;
cin >> c >> num; // 读取当前字符和长度
if (c == p) { // 如果当前字符与前一个字符相同
flag = 0; // 标记为未充分压缩
}
p = c; // 更新前一个字符为当前字符
}
cout << (flag ? "Yes" : "No"); // 根据标记输出结果
return 0;
}
代码注释
-
头文件和命名空间:
#include <bits/stdc++.h> using namespace std;
#include <bits/stdc++.h>
是一个万能头文件,包含了所有标准库头文件。using namespace std
允许直接使用标准库中的名称(如cin
、cout
)而不需要加std::
前缀。
-
主函数:
int main() {
- 程序的入口点。
-
读取输入:
int k; cin >> k;
- 读取压缩元素的数量 。
-
初始化变量:
char p = '\0'; bool flag = 1;
- 用于存储前一个字符,初始化为空字符
'\0'
。 - 是一个布尔标记,初始为
true
(即1
),表示默认是充分压缩的。
- 用于存储前一个字符,初始化为空字符
-
循环处理每个压缩元素:
for (int i = 0; i < k; i++) { char c; int num; cin >> c >> num;
- 循环 次,每次读取一个字符 和一个整数 。
-
检查相邻字符是否相同:
if (c == p) { flag = 0; }
- 如果当前字符 与前一个字符 相同,则将 设为
false
(即0
),表示未充分压缩。
- 如果当前字符 与前一个字符 相同,则将 设为
-
更新前一个字符:
p = c;
- 将 更新为当前字符 ,以便下一次比较。
-
输出结果:
cout << (flag ? "Yes" : "No");
- 根据 的值输出
Yes
或No
。
- 根据 的值输出
-
程序结束:
return 0;
- 返回
0
,表示程序正常结束。
- 返回
总结
-
算法思路:
- 遍历所有压缩元素,检查当前字符是否与前一个字符相同。
- 如果发现任何相邻字符相同的情况,立即标记为未充分压缩。
- 最后根据标记输出结果。
-
时间复杂度:
- 只需要一次遍历,时间复杂度为 ,其中 是压缩元素的数量。
- 由于 最多是 ,这种复杂度是完全可行的。
-
空间复杂度:
- 只使用了常数个额外变量( 和 ),空间复杂度为 。
这个解法高效且简洁,能够正确处理题目中的所有情况。
全部评论 2
糖
2025-08-19 来自 浙江
0糖
2025-08-18 来自 浙江
0?
-_-
2025-08-19 来自 浙江
0同意
2025-08-19 来自 浙江
0
有帮助,赞一个