首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >[NOIP2011]统计单词数

[NOIP2011]统计单词数

作者头像
@VON
发布于 2025-12-21 11:49:18
发布于 2025-12-21 11:49:18
2790
举报

题目描述

一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章 中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )

输入描述:

代码语言:javascript
复制
共 2 行。
第 1 行为一个字符串,其中只含字母,表示给定单词;
第 2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章

输出描述:

代码语言:javascript
复制
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 0 开始);如果单词在文章中没有出现,则直接输出一个整数 -1。

示例1

输入

代码语言:javascript
复制
To
to be or not to be is a question

输出

代码语言:javascript
复制
2 0

说明

代码语言:javascript
复制
输出结果表示给定的单词 To 在文章中出现两次,第一次出现的位置为0。 

示例2

输入

代码语言:javascript
复制
to
Did the Ottoman Empire lose its power at that time

输出

代码语言:javascript
复制
-1

说明

代码语言:javascript
复制
表示给定的单词 to 在文章中没有出现,输出整数-1。 

题解

代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;

// 将字符串中的大写字母转换为小写字母
string change(string str) {
    for (int i = 0; i < str.length(); i++) {
        // 如果字符是大写字母,则转换为小写
        if (str[i] >= 'A' && str[i] <= 'Z') {
            str[i] = str[i] - 'A' + 'a';
        }
    } 
    return str;  // 返回转换后的字符串
} 

int main() {
    int index, count = 0;  // index 用于存储子字符串的位置,count 用于统计出现次数
    string card, sentence;  // card 代表要查找的单词,sentence 代表输入的句子

    // 输入要查找的单词
    getline(cin, card);  
    card = " " + card + " ";  // 在单词前后添加空格,以确保匹配完整单词
    
    // 输入要查找的句子
    getline(cin, sentence);  
    sentence = " " + sentence + " ";  // 在句子前后添加空格,确保匹配

    // 将单词和句子都转换为小写,进行不区分大小写的比较
    card = change(card);
    sentence = change(sentence); 

    // 查找子字符串第一次出现的位置
    index = sentence.find(card, 0);

    // 统计子字符串在句子中出现的次数
    while (index != -1) {  // 当找到子字符串时
        count++;  // 增加计数
        index = sentence.find(card, index + 1);  // 寻找下一个出现的位置
    }

    // 输出结果
    if (count == 0) {  // 如果未找到
        cout << "-1";  // 输出 -1 表示未找到
    } else {
        // 输出出现次数和第一次出现的位置
        cout << count << " " << sentence.find(card) << endl;  
    }
    
    return 0;  // 结束程序
}

change 函数:用于将输入字符串中的字符转换为小写。该函数遍历字符串的每一个字符,将所有大写字母转换为相应的小写字母。

main 函数:

声明变量 index 用于存储子字符串第一次出现的位置,count 用于统计子字符串的出现次数。

使用 getline 来输入要查找的单词和句子,确保输入包含空格的完整内容。

在查找单词和句子的前后都添加空格,以确保匹配的是整个单词而不是单词的一部分。

将 card 和 sentence 转换为小写字符串,以避免大小写对查找结果的影响。

使用 find 函数查找 card 在 sentence 中第一次出现的位置,并在循环中统计它的总出现次数。

最后根据统计结果输出出现次数和第一次出现的位置,如果未找到则输出 -1。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-11,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 题目描述
    • 输入描述:
    • 输出描述:
    • 输入
    • 输出
    • 说明
    • 输入
    • 输出
    • 说明
  • 题解
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档