1 条题解
-
0
📝 题目大意
给定一个只含
o和-的长度为 的字符串 ,求 的某个连续子串能构成的"团子字符串"的最大等级。团子字符串定义为:恰好一端是-、其余 个字符全是o、长度为 的字符串(如ooo-或-ooo)。若不存在则输出-1。💡 解题思路
-
题目分析:,需要 的解法。团子字符串的本质是"一段连续的
o,且旁边至少有一个-"。 -
算法推导:
- 首先,若字符串中全为
o或全为-,则无法构成任何团子字符串,直接输出-1(对应std.cpp中c1==0 || c2==0的判断)。 - 否则,问题转化为:求字符串中最长连续
o的个数。因为只要存在至少一个-,最长连续o段必然能找到一个相邻的-(除非最长连续o段恰好位于字符串两端且没有相邻-,但此时因为有-存在,必然有某个o段旁边有-,而最长连续o段一定不短于该段,且它本身要么在某端要么在中间,总能找到相邻的-)。 - 具体实现:遍历字符串,用变量
c记录当前连续o的个数。遇到-时,用c更新答案ans,并将c清零;遇到o则c++。遍历结束后再用c更新一次ans(处理末尾的连续o)。
- 首先,若字符串中全为
-
边界与细节:
- 全
o或全-的情况 → 输出-1。 - 字符串以
o结尾时,需要在循环结束后再用c更新一次ans(std.cpp第 38 行)。 - 答案至少为 1,因为只要两种字符都有,必然存在至少一个
o旁边有-。
- 全
⏱️ 复杂度分析
- 时间复杂度:,只需两次遍历字符串(一次统计,一次求最长连续段)。
- 空间复杂度:,用于存储字符串 。
💻 标准代码 (C++)
#include <bits/stdc++.h> using namespace std; const int N = 2e5 + 10; char s[N]; int c1 = 0, c2 = 0, c = 0; // c1: 'o'的个数, c2: '-'的个数, c: 当前连续'o'的个数 int main() { int n; cin >> n; cin >> s + 1; // 1-indexed 读入字符串 // 第一遍扫描:统计两种字符的数量 for (int i = 1; i <= n; i++) { if (s[i] == 'o') { c1++; } else if (s[i] == '-') { c2++; } } // 若缺少任何一种字符,无法构成团子字符串 if (c1 == 0 || c2 == 0) { cout << -1 << endl; return 0; } c = 0; int ans = 0; // 第二遍扫描:求最长连续'o'的长度 for (int i = 1; i <= n; i++) { if (s[i] == '-') { ans = max(ans, c); // 遇到'-',结算当前连续'o'的长度 c = 0; // 重置计数器 } else c++; // 遇到'o',累加 } ans = max(ans, c); // 处理末尾可能的一段连续'o' cout << ans << endl; return 0; } -
- 1
信息
- ID
- 712
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 2
- 已通过
- 1
- 上传者