1 条题解

  • 0
    @ 2026-6-19 10:30:39

    📝 题目大意

    给定一个仅由 ABC 组成、长度为 NN 的字符串 SS,找出连续子串 "ABC" 第一次出现的位置(1-indexed),若不存在则输出 1-1

    💡 解题思路

    1. 题目分析:数据范围 3N1003 \leq N \leq 100,非常小,直接模拟即可。需要找的是连续三个字符恰好为 "ABC" 的子串,输出其起始位置的下标(从 1 开始计数)。

    2. 算法推导

      • 初始化答案变量 pos = -1(表示默认未找到)。
      • 遍历 SS 中所有可能的起点 ii(0-indexed),范围为 0iN30 \leq i \leq N-3
      • 对每个起点 ii,检查 S[i] == 'A' && S[i+1] == 'B' && S[i+2] == 'C'
      • 若满足条件,记录 pos = i + 1(转换为 1-indexed),并立即 break 跳出循环——因为只需要第一次出现的位置。
      • 最后输出 pos。若从未匹配到,pos 保持 1-1,符合题目要求。
    3. 边界与细节

      • NN 最小值即为 33,因此 i <= N - 3N=3N = 3 时等价于 i <= 0,只检查一个位置,循环正常执行。
      • 题目明确要求输出第一次出现的位置,因此在找到第一个匹配后必须立即 break,否则会被后续匹配覆盖。
      • 字符串只含 ABC,不会有其他字符,无需额外判断。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),遍历字符串中 N2N-2 个可能的起点,每次检查三个字符,常数级操作。
    • 空间复杂度O(1)O(1),只用了常数个变量。

    💻 标准代码 (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
    上传者