1 条题解

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

    📝 题目大意

    给定一个由小写字母和 . 组成的字符串 SS,保证 SS 至少包含一个 . 且不以 . 结尾。要求输出 SS 中最后一个 . 之后的部分(即按 . 分割后的最后一个子串)。

    💡 解题思路

    1. 题目分析

      • 字符串长度 2S1002 \le |S| \le 100,数据范围极小,任何 O(n)O(n) 算法均可通过。
      • 题目保证 SS 至少包含一个 .,且末尾不是 .,因此无需处理边界缺失情况。
      • 样例提示了 . 可能连续出现、可能出现在开头,但这些都不影响"找最后一个 ."这一核心逻辑。
    2. 算法推导

      • 核心问题等价于:找到字符串 SS最后一个 . 的位置,然后输出该位置之后的所有字符。
      • 使用 find_last_of('.') 找到最后一个 . 的下标 pos
      • 使用 substr(pos + 1) 截取从 pos + 1 到末尾的子串,即为答案。
      • 结合题目保证(至少有一个 . 且末尾不是 .),pos 一定存在且 pos + 1 不会越界。
    3. 边界与细节

      • 样例 3(.z)中 . 在开头,pos = 0substr(1) 输出 z,逻辑正确。
      • 样例 4(..........txt)中连续多个 .find_last_of 仍能找到最后一个,逻辑正确。
      • 无需额外判断,因为题目已保证输入合法。

    ⏱️ 复杂度分析

    • 时间复杂度O(n)O(n),其中 nn 为字符串长度。find_last_of 需要遍历一次字符串。
    • 空间复杂度O(n)O(n),存储输入字符串。

    💻 标准代码 (C++)

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main() {
        string S;
        cin >> S;
        // 找到最后一个 '.' 的位置
        size_t pos = S.find_last_of('.');
        // 输出 '.' 之后的所有字符(即最后一个子串)
        cout << S.substr(pos + 1) << endl;
        return 0;
    }
    
    • 1

    信息

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