1 条题解

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

    📝 题目大意

    给定一个由 <=> 组成的字符串 SS,判断它是否为"双向箭头型"字符串——即恰好由一个 < 开头、一个 > 结尾,中间全部由 kkk1k \ge 1)个 = 填充。

    💡 解题思路

    1. 题目分析

      • 字符串长度 3S1003 \le |S| \le 100,数据范围极小,直接模拟即可。
      • 双向箭头型的定义是严格的:< + 若干 = + >,不允许任何其他字符穿插。
    2. 算法推导

      • n=Sn = |S|,首先 n3n \ge 3 是必要条件(否则长度不足以容纳 <=>)。
      • 检查 S[0]S[0] 是否为 '<',不满足则直接输出 No
      • 检查 S[n1]S[n-1] 是否为 '>',不满足则直接输出 No
      • 遍历下标 11n2n-2(即中间部分),若存在任何一个字符不是 '=',输出 No
      • 上述条件全部满足则输出 Yes
    3. 边界与细节

      • 题目保证 S3|S| \ge 3,但代码中显式判断 n<3n < 3 更加安全。
      • 中间部分 kk 可以为 00 吗?题目描述中 kk正整数,所以中间至少有一个 =。但代码中循环 for (int i = 1; i < n - 1; i++)n=3n=3 时只会执行一次(检查 S[1]),此时 k=1k=1,符合题意。若 n=2n=2 则被前面的 n<3n<3 拦截,不会进入循环,逻辑自洽。
      • 注意 = 是等号,不是减号 -。样例 2(==>)因为没有 < 开头而输出 No,样例 3(<> >)因为中间混入了 > 而输出 No

    ⏱️ 复杂度分析

    • 时间复杂度O(n)O(n),只需遍历字符串一次。
    • 空间复杂度O(n)O(n),存储输入字符串。

    💻 标准代码 (C++)

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main() {
        string S;
        cin >> S;
        
        int n = S.length();
        
        // 长度至少为3(至少包含 '<', '=', '>' 各一个)
        if (n < 3) {
            cout << "No" << endl;
            return 0;
        }
        
        // 第一个字符必须是 '<'
        if (S[0] != '<') {
            cout << "No" << endl;
            return 0;
        }
        
        // 最后一个字符必须是 '>'
        if (S[n - 1] != '>') {
            cout << "No" << endl;
            return 0;
        }
        
        // 中间的所有字符必须全部是 '='
        for (int i = 1; i < n - 1; i++) {
            if (S[i] != '=') {
                cout << "No" << endl;
                return 0;
            }
        }
        
        // 所有条件满足,是双向箭头型字符串
        cout << "Yes" << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    781
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者