1 solutions

  • 0
    @ 2026-5-19 19:24:13

    题解:哈基米有南北绿豆永动机

    这是一道基础的字符串模式匹配题目。题目要求判断给定的长字符串 ss 中是否包含连续的、顺序一致的子串 hachimi


    1. 核心思路

    题目中对“子字符串”的定义非常明确:

    s2s_2 的每一个字符在 s1s_1 中出现并必须在原始字符串中位置相邻顺序一致

    这在计算机科学中就是标准的子串(Substring)查找。由于本题目标字符串 hachimi 是固定的且长度较短(仅 7 个字符),而原字符串长度 s105|s| \leqslant 10^5,我们有多种方式实现:

    1. 内置函数(推荐): 大多数高级语言(如 C++ 的 string::find,Python 的 in 关键字)都内置了高效的字符串查找算法。
    2. 滑动窗口/遍历: 遍历原字符串,检查以每个位置开始的长度为 7 的子串是否等于 hachimi

    2. 代码实现

    C++ 实现

    在 C++ 中,可以使用 std::stringfind 成员函数。如果找到子串,它会返回子串出现的起始位置;如果没找到,则返回 string::npos

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main() {
        string s;
        if (!(cin >> s)) return 0;
    
        // 使用 string 的 find 函数查找子串
        if (s.find("hachimi") != string::npos) {
            cout << "Yes" << endl;
        } else {
            cout << "No" << endl;
        }
    
        return 0;
    }
    
    

    Python 实现

    Python 的实现最为简洁,直接使用 in 运算符即可。

    s = input().strip()
    if "hachimi" in s:
        print("Yes")
    else:
        print("No")
    
    

    3. 复杂度分析

    • 时间复杂度: O(starget)O(|s| \cdot |target|) 或更优。

    • 在最坏情况下(朴素匹配),时间复杂度为 O(N×M)O(N \times M),其中 NN 是原串长度,MM 是目标串长度(这里 M=7M=7)。

    • 对于 10510^5 的数据量,这个复杂度绰绰有余(约 7×1057 \times 10^5 次运算)。

    • 空间复杂度: O(s)O(|s|)。需要空间存储输入的字符串。


    4. 常见坑点提醒

    1. 子串 vs 子序列: 题目强调了“位置相邻”,所以是子串。如果是“子序列”,则不需要字符相邻。
    2. 输入长度: 字符串长度可达 10510^5,确保使用的数组或容器能够容纳,并使用高效的输入方式(如 C++ 中的 cinscanf)。
    3. 大小写: 题目虽然说输出不区分大小写,但输入的字符串是由“小写字母组成”的,因此匹配时直接匹配小写的 hachimi 即可。

    Information

    ID
    26
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    10
    Tags
    # Submissions
    5
    Accepted
    4
    Uploaded By