文章

【GESP】C++三级练习 luogu-B2156 最长单词 2

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

luogu-B2156 最长单词 2

题目要求

题目描述

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

输入格式

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

输出格式

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

输入输出样例 #1

输入 #1

1
I am a student of Peking University.

输出 #1

1
University

题目分析

解题思路

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

复杂度分析:

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


示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#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;
}

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

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

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

本文由作者按照 CC BY 4.0 进行授权