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 custom/custom-post-content-inner.html %}


示例代码

#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;
}

{% include custom/custom-post-content-footer.md %}

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

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

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

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
Last updated on