top1编程
← 返回题目
题解

最长的单词

1 条题解

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

    解题思路

    这道题用"打擂台"的方法找最长的单词:

    • 先准备两个"擂主"变量:best 存当前最长的单词,maxlen 存当前最长长度,初始长度为 0。
    • 一个单词一个单词地读进来,和擂主比一比:
      • 如果当前单词的长度大于 maxlen,就更新擂主:maxlen 变成它的长度,best 变成这个单词;
      • 否则擂主不变。
    • 全部读完,best 就是最长的单词。

    这里要注意:题目说"若最长的英文单词有多个,输出最先出现的那个"。所以我们更新时一定要用严格大于 >,而不是大于等于 >=。这样当出现一个和擂主一样长的单词时,不会顶替掉先出现的那个,最先出现的就一直保留着。

    用样例验证:I style role table on

    • I:长度1 > 0,擂主变成 I(1)
    • style:长度5 > 1,擂主变成 style(5)
    • role:长度4 不大于5,不变
    • table:长度5 不大于5,不变(所以不替换最先出现的 style)
    • on:长度2 不大于5,不变

    输出 style,和样例一致。

    参考代码

    #include <iostream>
    using namespace std;
    // 用途:找出n个单词中最长的单词,若有多个最长则输出最先出现的那个
    int main() {
        int n;
        cin >> n;
        string best;      // 当前找到的最长单词
        int maxlen = 0;   // 当前最长长度
        for (int i = 0; i < n; i++) {
            string s;
            cin >> s;
            // 只有严格大于才更新,这样长度并列时保留最先出现的单词
            if ((int)s.size() > maxlen) {
                maxlen = s.size();
                best = s;
            }
        }
        cout << best << endl;
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:每个单词只需要取一次长度做比较,单词最多100个,所以是 O(n),其中 n 是单词个数。
    • 空间复杂度:只用了几个变量存当前最长单词,是 O(1)。

    一次遍历就解决问题,非常高效。

    • 1