1. 题目背景与需求解析
这道来自NOIP2011普及组的编程题目,考察的是字符串处理的基础能力。题目要求我们在一段给定的文本中统计特定单词出现的次数,并首次出现的位置。看似简单,实则暗藏多个需要仔细处理的边界条件。
在实际开发中,类似的需求非常常见。比如文档搜索功能、日志关键词统计、数据清洗时的字段匹配等场景都会用到这种基础但关键的字符串处理能力。这也是为什么这类题目会成为编程竞赛的经典题型。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心解题思路
2.1 问题分解
首先我们需要明确几个关键要求:
- 统计单词出现的次数
- 记录单词首次出现的位置
- 大小写不敏感(即"Hello"和"hello"视为相同)
- 必须是完整单词匹配(即"her"不能匹配"there")
2.2 算法选择
对于这种字符串匹配问题,最直接的思路是:
- 将文本和查询词统一转为小写(解决大小写问题)
- 将文本按空格分割成单词列表
- 遍历列表进行精确匹配计数
- 记录第一个匹配项的索引位置
这种方法时间复杂度为O(n),空间复杂度为O(n),对于普及组题目完全足够。
3. 实现细节与关键代码
3.1 输入处理
首先我们需要正确处理输入。题目说明中明确输入有两行:
- 第一行是待查询的单词
- 第二行是待搜索的文章
python复制word = input().strip().lower()
text = input().strip().lower()
这里使用strip()去除首尾空白,lower()统一转为小写。
3.2 单词分割
将文章分割为单词列表时,需要注意:
- 连续多个空格的情况
- 开头和结尾可能有空格
- 标点符号可能紧跟着单词
python复制words = text.split()
Python的split()方法默认会处理连续空格的情况,但不会处理标点符号。对于本题的测试用例已经足够。
3.3 匹配计数
遍历单词列表进行匹配计数:
python复制count = 0
first_pos = -1
for i, w in enumerate(words):
if w == word:
if first_pos == -1:
