top1编程
← 返回题目
题解

单词过滤

1 条题解

  • 0
    @ 2026-8-5 12:17:22

    解题思路

    题目要求把包含 tr 的单词过滤掉,留下不含 tr 的单词。

    怎么判断一个单词里有没有 tr 呢?C++ 的 string 提供了一个现成的查找函数 find:

    • s.find("tr") 会返回 tr 在 s 里第一次出现的位置(从0开始数);
    • 如果找不到,就返回一个特殊的常量 string::npos。

    所以判断条件就是:s.find("tr") == string::npos,成立就说明这个单词里没有 tr,要保留下来输出。

    输出时要注意空格:用一个 first 标记记录"是不是第一个要输出的单词"。第一个单词前面不加空格,之后每个单词前面先输出一个空格。

    用样例验证:tree try abandon 三个单词:

    • tree 里有 tr,过滤掉;
    • try 里有 tr,过滤掉;
    • abandon 里没有 tr,保留输出。

    结果就是 abandon,和样例一致。

    参考代码

    #include <iostream>
    using namespace std;
    // 用途:过滤掉所有包含"tr"的单词,输出剩下的单词
    int main() {
        int n;
        cin >> n;
        bool first = true;   // 标记是否第一次输出,用来控制空格
        for (int i = 0; i < n; i++) {
            string s;
            cin >> s;
            // 字符串中没有"tr"(find找不到时返回npos)才保留
            if (s.find("tr") == string::npos) {
                if (!first) cout << ' ';   // 不是第一个单词时先输出空格
                cout << s;
                first = false;
            }
        }
        cout << endl;
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:有 n 个单词(最多100个),每个单词长度不超过50。find 最多看遍整个单词,所以总时间是 O(n × 单词长度) ≈ O(n),非常快。
    • 空间复杂度:只用一个临时字符串,是 O(1)。
    • 1