OneCoder Avatar
OneCodercoderli.com · 938 篇博文
三级

C++ 算法考级专栏

真题分析、矩阵探测、递归回溯与基础语法

🎨 视觉封面

【GESP】C++三级练习 luogu-B2121 最长最短单词

📅 2025-04-14·✍️ OneCoder·计算中...·⏱️ 6 分钟
#GESP#C++#字符串

GESP三级练习,字符串练习(C++三级大纲中6号知识点,字符串),难度★★☆☆☆。

luogu-B2121 最长最短单词

题目要求

题目描述

输入 11 行句子(不多于 200200 个单词,每个单词长度不超过 100100),只包含字母、空格、逗号和句号。单词由至少一个连续的字母构成,空格、逗号和句号都是单词间的间隔。

输出第 11 个最长的单词和第 11 个最短单词。

输入格式

输入数据:一行句子。

输出格式

输出数据:

11 行,第一个最长的单词。

22 行,第一个最短的单词。

输入输出样例 #1

输入 #1

BASH
I am a student,i am studying Programming language C in Peking University.

输出 #1

BASH
Programming
I

题目分析

解题思路

  1. 读取一整行输入的句子,包含单词、空格、逗号和句号
  2. 遍历句子中的每个字符:
    • 遇到字母时,将其加入当前单词
    • 遇到分隔符(空格、逗号或句号)时,判断当前单词:
      • 如果当前单词长度大于最长单词,更新最长单词
      • 如果当前单词长度小于最短单词,更新最短单词
      • 清空当前单词,准备处理下一个单词
  3. 遍历结束后,还需要检查最后一个单词(如果句子不以分隔符结尾)
  4. 按要求格式输出最长和最短单词:
    • 第一行输出最长单词
    • 第二行输出最短单词

复杂度分析:

  • 时间复杂度为 O(n)O(n),其中n为输入句子的总长度
  • 空间复杂度为 O(m)O(m),其中m为最长单词的长度

示例代码

CPP
#include <iostream>
#include <string>

int main() {
    // 定义输入字符串变量
    std::string str;
    // 读取一整行输入,包含空格
    std::getline(std::cin, str);
    // 获取字符串长度
    int length = str.length();
    // 初始化最大长度和最小长度
    int max_length = 0;
    int min_length = 100;
    // 存储最长和最短单词
    std::string str_max, str_min;
    // 当前单词字符计数
    int count = 0;
    // 遍历字符串的每个字符
    for (int i = 0; i < length; i++) {
        // 遇到分隔符(空格、逗号、句号)时处理当前单词
        if (str[i] == ' ' || str[i] == ',' || str[i] == '.') {
            // 跳过连续的分隔符
            if (count == 0) {
                continue;
            }
            // 更新最长单词
            if (count > max_length) {
                max_length = count;
                str_max = str.substr(i - count, count);
            }
            // 更新最短单词
            if (count < min_length) {
                min_length = count;
                str_min = str.substr(i - count, count);
            }
            // 重置计数器
            count = 0;
        }
        // 处理最后一个字符
        else if (i == length - 1) {
            count++;
            // 更新最长单词
            if (count > max_length) {
                max_length = count;
                str_max = str.substr(i - count + 1, count);
            }
            // 更新最短单词
            if (count < min_length) {
                min_length = count;
                str_min = str.substr(i - count + 1, count);
            }
        }
        // 累加字母计数
        else {
            count++;
        }
    }
    // 输出结果
    std::cout << str_max << std::endl;
    std::cout << str_min << std::endl;
    return 0;
}

💡 OneCoder 资源指引

所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI

🤝 技术交流与答疑

欢迎加入:C++ GESP/CSP 考级答疑群(688906745)Java/Python交流群(982860385),点击可直接加群。

📚

猜你想读 · 相关文章推荐

OneCoder

OneCoder (lihongzheshuai)

一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com

💬 读者留言与交流

0 条讨论
✨ 支持 Markdown 语法格式
还没有留言,快来成为第一个讨论者吧!