1 条题解

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

    📝 题目大意

    给定两个由小写字母组成的字符串 SSTT,判断 TT 是否是 SS 的连续子串。

    💡 解题思路

    1. 题目分析S,T100|S|, |T| \leq 100,数据范围极小,可以直接使用字符串库函数判断子串关系。
    2. 算法推导
      • 使用 C++ 的 string::find() 方法,它在 SS 中查找 TT 的首次出现位置。
      • 若查找成功,find() 返回 TTSS 中的起始下标(一个 0\ge 0 的整数);若查找失败,返回 string::npos(一个很大的值,通常为 26412^{64}-1)。
      • 因此只需判断返回值是否小于一个足够大的数(如 10710^7),即可区分"找到"与"未找到"。
    3. 边界与细节
      • S=TS = T 时显然为子串,答案为 Yes(见样例 4)。
      • T>S|T| > |S| 时必然不是子串,find() 会返回 npos,输出 No(见样例 3)。
      • 注意区分大小写:题目保证全为小写字母,无需额外处理。

    ⏱️ 复杂度分析

    • 时间复杂度O(ST)O(|S| \cdot |T|)string::find() 在最坏情况下的复杂度。
    • 空间复杂度O(S+T)O(|S| + |T|),用于存储两个输入字符串。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    
    int main(){
        string s, x;
        cin >> s >> x;  // 读入字符串 S 和 T
    
        // find() 若找到子串则返回起始下标(≥0),否则返回 string::npos(一个极大值)
        // 用 < 10000000 来判断是否找到,避免直接使用 string::npos 常量
        if (s.find(x) < 10000000)
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    
        return 0;
    }
    
    • 1

    信息

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