【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
- 遇到空格时,比较当前单词长度与最长单词长度
- 如果当前单词更长,更新最长单词及其长度
- 重置当前单词长度为0
- 特殊处理最后一个单词(不含句点):
- 比较最后一个单词长度与最长单词长度
- 如果最后单词更长,更新最长单词
- 输出最长的单词
复杂度分析:
- 时间复杂度为 $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 进行授权