1 条题解

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

    📝 题目大意

    给定两个仅含小写英文字母的字符串 SSTT,判断 SS 是否为 TT 的前缀(即 TT 的前 S|S| 个字符是否恰好等于 SS)。

    💡 解题思路

    1. 题目分析:字符串长度 S,T100|S|, |T| \le 100,数据规模极小,直接按定义模拟即可。核心约束:SS 作为前缀,长度不能超过 TT,否则必然不是前缀。

    2. 算法推导

      • 读入 SS(代码中变量 n)和 TT(代码中变量 m)。
      • x=Sx = |S|y=Ty = |T|
      • 剪枝:若 x>yx > ySS 不可能为 TT 的前缀,直接输出 No 并结束。
      • 遍历 i=0x1i = 0 \sim x-1,逐个比较 S[i]S[i]T[i]T[i]
        • 若存在 S[i]T[i]S[i] \neq T[i],输出 No 并结束。
      • 所有前 xx 个字符均匹配,输出 Yes
    3. 边界与细节

      • SSTT 相等时,SSTT 的前缀(样例 3),算法中 x=yx = y,逐字符比较全部相等后输出 Yes,逻辑正确。
      • SS 长于 TT 时(样例 4),长度判断直接剪枝输出 No,避免后续数组越界访问。
      • 循环边界 i <= x-1 等价于 i < x,注意不要写成 i <= x 导致多比较一次。
      • 输出区分大小写,必须严格输出 YesNo

    ⏱️ 复杂度分析

    • 时间复杂度O(min(S,T))O(\min(|S|, |T|)),至多比较 min(x,y)\min(x, y) 个字符。由于 S,T100|S|, |T| \le 100,实际为 O(1)O(1) 级别。
    • 空间复杂度O(S+T)O(|S| + |T|),仅存储两个输入字符串。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        string n, m;           // n = S, m = T
        cin >> n >> m;         // 读入两个字符串
        int x, y;
        x = n.size();          // x = |S|
        y = m.size();          // y = |T|
        if(x > y){             // 剪枝:S 比 T 长,不可能为前缀
            cout << "No";
            return 0;
        }
        for(int i = 0; i <= x - 1; i++){ // 逐一比较前 x 个字符
            if(n[i] != m[i]){            // 发现不匹配
                cout << "No";
                return 0;
            }
        }
        cout << "Yes";         // 全部匹配,S 是 T 的前缀
        return 0;
    }
    
    • 1

    信息

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