top1编程
← 返回题目
题解

最长最短单词

1 条题解

  • 0
    @ 2026-8-5 10:18:17

    解题思路

    一句话里的单词由连续字母构成,空格和逗号都是单词之间的间隔。要找出第一个最长的单词和第一个最短的单词。

    做法:从头到尾扫描句子,把单词一个一个"挖"出来:

    1. 跳过间隔符:如果当前字符不是字母(是空格或逗号),就继续往后走。
    2. 收集单词:从当前位置开始,把连续的字母拼成一个单词 w。
    3. 更新答案:
      • 如果 L 还是空的,或者 w 比 L 更长,就用 w 更新 L(最长单词)。
      • 如果 S 还是空的,或者 w 比 S 更短,就用 w 更新 S(最短单词)。
    4. 重复以上步骤,直到句子扫描完。

    这里更新答案用的是"严格大于/小于"(>、<),不用 >=、<=,这样当出现长度相同的单词时,会保留最先出现的那个,正好符合题目"第一个最长/最短"的要求。如果所有单词长度一样,那么第一个单词自然同时是最长和最短。

    举例:I am studying Programming language C in Peking University。扫描后最长的是 Programming(11 个字母),最短的是 I(1 个字母)。

    参考代码

    // 最长最短单词:找出一句话中第一个最长和第一个最短的单词
    #include <iostream>
    using namespace std;
    int main() {
        string s;            // 整个句子
        getline(cin, s);     // 整行读入
        int n = s.size();
        string L = "", S = ""; // L记录最长单词,S记录最短单词
        for (int i = 0; i < n; ) {
            // 跳过空格和逗号这些分隔符
            while (i < n && !((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z'))) i++;
            string w = "";    // 收集一个单词
            while (i < n && ((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z'))) {
                w += s[i];    // 连续的字母组成一个单词
                i++;
            }
            if (w != "") {
                if (L == "" || w.size() > L.size()) L = w; // 更新最长
                if (S == "" || w.size() < S.size()) S = w; // 更新最短
            }
        }
        cout << L << endl << S << endl;
        return 0;
    }
    

    复杂度分析

    句子最多 200 个单词,每个单词长度不超过 100,句子总长度约 n。扫描时每个字符最多被处理一次,时间复杂度 O(n)。空间上需要保存句子和两个答案字符串,也是 O(n)。

    • 1