luogu-B2156 最长单词 2

luogu-B2156 最长单词 2

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

luogu-B2156 最长单词 2

题目要求

题目描述

一个以 . 结尾的简单英文句子,单词之间用空格分隔,没有缩写形式和其它特殊形式,求句子中的最长单词。

输入格式

一个以 . 结尾的简单英文句子(长度不超过 500500),单词之间用空格分隔,没有缩写形式和其它特殊形式。

输出格式

该句子中最长的单词。如果多于一个,则输出第一个。

输入输出样例 #1

输入 #1

I am a student of Peking University.

输出 #1

University

题目分析

解题思路

  1. 读取一行英文句子,存储到字符串变量中
  2. 遍历句子,统计单词长度:
    • 定义变量记录当前单词长度和最长单词长度
    • 定义变量存储最长的单词
  3. 处理单词:
    • 遇到字母时,当前单词长度加1
    • 遇到空格时,比较当前单词长度与最长单词长度
    • 如果当前单词更长,更新最长单词及其长度
    • 重置当前单词长度为0
  4. 特殊处理最后一个单词(不含句点):
    • 比较最后一个单词长度与最长单词长度
    • 如果最后单词更长,更新最长单词
  5. 输出最长的单词

复杂度分析:

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

示例代码

#include <iostream>
#include <string>

int main() {
    // 定义字符串变量存储输入的句子
    std::string str;
    // 读取一行输入,包含空格
    getline(std::cin, str);
    // 记录最长单词的长度
    int max_count = 0;
    // 记录当前单词的长度
    int count = 0;
    // 存储最长的单词
    std::string max_str;
    // 遍历字符串,注意减1是为了不处理最后的句点
    for (int i = 0; i < str.size() - 1; i++) {
        // 如果不是空格,说明是单词的一部分
        if (str[i] != ' ') {
            count++;
        } else {
            // 遇到空格,判断当前单词是否为最长单词
            if (count > max_count) {
                // 截取最长单词并保存
                max_str = str.substr(i - count, count);
                max_count = count;
            }
            // 重置当前单词长度计数器
            count = 0;
        }
    }
    // 处理最后一个单词(不包含句点)
    if (count > max_count) {
        max_str = str.substr(str.size() - 1 - count, count);
    }
    // 输出最长的单词
    std::cout << max_str << std::endl;
    return 0;
}

【2025年9月25日更新】

补充利用cin直接读入的方式,代码更简洁

#include <iostream>
#include <string>

int main() {
    std::string str;           // 用于存储每次读入的单词
    int max_count = 0;         // 记录最长单词的长度
    std::string max_str;       // 存储最长的单词

    // 循环读取单词,直到遇到文件结束符或输入结束
    while(std::cin >> str) {
        // 如果单词末尾是句点,则去掉句点
        if (str.back() == '.') {
            str.pop_back();
        }
        
        int str_length = str.length();  // 获取当前单词的长度
        
        // 如果当前单词长度大于已记录的最长长度
        if (str_length > max_count) {
            max_count = str_length;     // 更新最长长度
            max_str = str;              // 更新最长单词
        }
    }
    
    // 输出最长的单词
    std::cout << max_str << std::endl;
    return 0;
}

上述代码在本地调试时候,可以需要通过Ctrl+Z退出循环。不过在洛谷等OJ平台可通过测试。当然你可以通过判断字符串以.结尾,则break退出循环的方式来自动退出循环。


本文由coderli.com原创,按照CC BY-NC-SA 4.0 进行授权

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

luogu-”系列题目可在 洛谷题库 在线评测。

bcqm-”系列题目可在 编程启蒙题库 在线评测。

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
最后更新于