题解
最长最短单词
1 条题解
-
0
解题思路
一句话里的单词由连续字母构成,空格和逗号都是单词之间的间隔。要找出第一个最长的单词和第一个最短的单词。
做法:从头到尾扫描句子,把单词一个一个"挖"出来:
- 跳过间隔符:如果当前字符不是字母(是空格或逗号),就继续往后走。
- 收集单词:从当前位置开始,把连续的字母拼成一个单词
w。 - 更新答案:
- 如果
L还是空的,或者w比L更长,就用w更新L(最长单词)。 - 如果
S还是空的,或者w比S更短,就用w更新S(最短单词)。
- 如果
- 重复以上步骤,直到句子扫描完。
这里更新答案用的是"严格大于/小于"(
>、<),不用>=、<=,这样当出现长度相同的单词时,会保留最先出现的那个,正好符合题目"第一个最长/最短"的要求。如果所有单词长度一样,那么第一个单词自然同时是最长和最短。举例:
I am studying Programming language C in Peking University。扫描后最长的是Programming(11 个字母),最短的是I(1 个字母)。参考代码
// 最长最短单词:找出一句话中第一个最长和第一个最短的单词 #include <iostream> using namespace std; int main() { string s; // 整个句子 getline(cin, s); // 整行读入 int n = s.size(); string L = "", S = ""; // L记录最长单词,S记录最短单词 for (int i = 0; i < n; ) { // 跳过空格和逗号这些分隔符 while (i < n && !((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z'))) i++; string w = ""; // 收集一个单词 while (i < n && ((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z'))) { w += s[i]; // 连续的字母组成一个单词 i++; } if (w != "") { if (L == "" || w.size() > L.size()) L = w; // 更新最长 if (S == "" || w.size() < S.size()) S = w; // 更新最短 } } cout << L << endl << S << endl; return 0; }复杂度分析
句子最多 200 个单词,每个单词长度不超过 100,句子总长度约 n。扫描时每个字符最多被处理一次,时间复杂度 O(n)。空间上需要保存句子和两个答案字符串,也是 O(n)。
- 1