1 条题解
-
0
📝 题目大意
给定一个仅由
A、B、C组成、长度为 的字符串 ,找出连续子串"ABC"第一次出现的位置(1-indexed),若不存在则输出 。💡 解题思路
-
题目分析:数据范围 ,非常小,直接模拟即可。需要找的是连续三个字符恰好为
"ABC"的子串,输出其起始位置的下标(从 1 开始计数)。 -
算法推导:
- 初始化答案变量
pos = -1(表示默认未找到)。 - 遍历 中所有可能的起点 (0-indexed),范围为 。
- 对每个起点 ,检查
S[i] == 'A' && S[i+1] == 'B' && S[i+2] == 'C'。 - 若满足条件,记录
pos = i + 1(转换为 1-indexed),并立即break跳出循环——因为只需要第一次出现的位置。 - 最后输出
pos。若从未匹配到,pos保持 ,符合题目要求。
- 初始化答案变量
-
边界与细节:
- 最小值即为 ,因此
i <= N - 3在 时等价于i <= 0,只检查一个位置,循环正常执行。 - 题目明确要求输出第一次出现的位置,因此在找到第一个匹配后必须立即
break,否则会被后续匹配覆盖。 - 字符串只含
A、B、C,不会有其他字符,无需额外判断。
- 最小值即为 ,因此
⏱️ 复杂度分析
- 时间复杂度:,遍历字符串中 个可能的起点,每次检查三个字符,常数级操作。
- 空间复杂度:,只用了常数个变量。
💻 标准代码 (C++)
#include <iostream> #include <string> using namespace std; int main() { int N; string S; cin >> N >> S; int pos = -1; // 默认未找到,输出 -1 // 遍历所有可能的长度为 3 的子串起点(0-indexed) for (int i = 0; i <= N - 3; i++) { // 检查当前位置开始的三个字符是否为 "ABC" if (S[i] == 'A' && S[i + 1] == 'B' && S[i + 2] == 'C') { pos = i + 1; // 转换为 1-indexed 位置 break; // 只取第一次出现,立即退出 } } cout << pos << endl; return 0; } -
- 1
信息
- ID
- 743
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者