题解
最长的单词
1 条题解
-
0
解题思路
这道题用"打擂台"的方法找最长的单词:
- 先准备两个"擂主"变量:
best存当前最长的单词,maxlen存当前最长长度,初始长度为 0。 - 一个单词一个单词地读进来,和擂主比一比:
- 如果当前单词的长度大于
maxlen,就更新擂主:maxlen变成它的长度,best变成这个单词; - 否则擂主不变。
- 如果当前单词的长度大于
- 全部读完,
best就是最长的单词。
这里要注意:题目说"若最长的英文单词有多个,输出最先出现的那个"。所以我们更新时一定要用严格大于
>,而不是大于等于>=。这样当出现一个和擂主一样长的单词时,不会顶替掉先出现的那个,最先出现的就一直保留着。用样例验证:
I style role table onI:长度1 > 0,擂主变成I(1)style:长度5 > 1,擂主变成style(5)role:长度4 不大于5,不变table:长度5 不大于5,不变(所以不替换最先出现的 style)on:长度2 不大于5,不变
输出
style,和样例一致。参考代码
#include <iostream> using namespace std; // 用途:找出n个单词中最长的单词,若有多个最长则输出最先出现的那个 int main() { int n; cin >> n; string best; // 当前找到的最长单词 int maxlen = 0; // 当前最长长度 for (int i = 0; i < n; i++) { string s; cin >> s; // 只有严格大于才更新,这样长度并列时保留最先出现的单词 if ((int)s.size() > maxlen) { maxlen = s.size(); best = s; } } cout << best << endl; return 0; }复杂度分析
- 时间复杂度:每个单词只需要取一次长度做比较,单词最多100个,所以是 O(n),其中 n 是单词个数。
- 空间复杂度:只用了几个变量存当前最长单词,是 O(1)。
一次遍历就解决问题,非常高效。
- 先准备两个"擂主"变量:
- 1