题解:洛谷 P1308 [NOIP 2011 普及组] 统计单词数

【题目来源】

洛谷:P1308 [NOIP 2011 普及组] 统计单词数 - 洛谷

【题目描述】

一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。

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

【输入】

\(2\) 行。

\(1\) 行为一个字符串,其中只含字母,表示给定单词;

\(2\) 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。

【输出】

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

【输入样例1】

To
to be or not to be is a question

【输出样例1】

2 0

【算法标签】

《洛谷 P1308 统计单词数》 #模拟# #字符串# #NOIP普及组# #2011#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

int main()
{
    string str, sent; // 声明两个字符串变量,str用于存储要查找的子串,sent用于存储目标字符串
    int pos, counts=0, ans; // pos用于存储查找位置,counts用于计数匹配次数,ans用于存储首次匹配的位置
  
    getline(cin, str); // 从标准输入读取一行字符串到str
    getline(cin, sent); // 从标准输入读取一行字符串到sent
  
    // 大小写转换:将str和sent中的所有大写字母转换为小写字母
    for (int i=0; i<str.length(); i++) {
        if (str[i]>='A' && str[i]<='Z') { // 判断字符是否为大写字母
            str[i] = str[i] - 'A' + 'a'; // 将大写字母转换为小写字母
        }
    }
    for (int i=0; i<sent.length(); i++) {
        if (sent[i]>='A' && sent[i]<='Z') { // 判断字符是否为大写字母
            sent[i] = sent[i] - 'A' + 'a'; // 将大写字母转换为小写字母
        }
    }
  
    str = " " + str + " "; // 在str前后各添加一个空格,防止部分匹配
    sent = " " + sent + " "; // 在sent前后各添加一个空格,防止部分匹配
  
    // 完全匹配:查找str在sent中的所有出现位置
    pos = sent.find(str, 0); // 从sent的第0个位置开始查找str
    ans = pos; // 记录首次匹配的位置
    while (pos != -1) { // 当找到匹配时继续查找
        counts++; // 匹配次数加1
        pos = sent.find(str, pos+1); // 从上次匹配位置的下一个位置继续查找
    }
  
    // 输出结果:如果未找到匹配,输出-1;否则输出匹配次数和首次匹配的位置
    if (ans == -1) {
        cout << -1;
    } else {
        cout << counts << " " << ans;
    }
  
    return 0; // 主函数返回0,表示程序正常结束
}

【运行结果】

To
to be or not to be is a question
2 0
posted @ 2026-02-16 16:04  团爸讲算法  阅读(1)  评论(0)    收藏  举报