1. 字符串处理基础与题目解析
字符串处理是编程竞赛中最基础的技能之一,也是信息学奥赛常考的重点内容。这道"最长最短单词"题目看似简单,却涵盖了字符串分割、遍历比较、边界处理等多个核心知识点。我们先来看题目要求:输入一行由字母、空格和逗号组成的句子,输出第一个最长的单词和第一个最短的单词。
在实际解题时,新手常会遇到几个典型问题:连续分隔符的处理(比如多个空格或逗号连在一起)、最后一个单词的遗漏、以及空输入的边界情况。我在第一次做这类题目时,就因为没有处理好连续逗号的情况导致程序崩溃。后来发现,关键是要建立一个"单词构造状态"的思维模型——只有当遇到非分隔符时才积累字符,遇到分隔符时完成当前单词的构造。
2. 两种经典解法对比
2.1 字符数组解法
这种解法适合C语言选手或者对内存控制有要求的场景。我们使用二维字符数组存储分割后的单词,就像整理抽屉一样,每个格子存放一个单词:
#include<bits/stdc++.h>
using namespace std;
int main() {
char s[205][105]; // 第一维是单词编号,第二维是字符位置
char c;
int w = 0, j = 0; // w是单词计数器,j是字符位置
while((c = getchar()) != '\n') {
if(c != ' ' && c != ',')
s[w][j++] = c;
else if(j != 0) { // 处理连续分隔符
s[w][j] = '\0';
w++;
j = 0;
}
}
s[w][j] = '\0'; // 处理最后一个单词
w++;
// 后续比较逻辑...
}
这种方法的优势是内存使用明确,但需要注意数组越界问题。我曾在一个项目中因为忘记给字符串添加结束符'\0',导致后续strle


308

被折叠的 条评论
为什么被折叠?



