题目描述

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

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

输入描述:

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

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

示例1

输入
To
to be or not to be is a question

输出
2 0
说明
输出结果表示给定的单词 To 在文章中出现两次,第一次出现的位置为0。

示例2

输入
to
Did the Ottoman Empire lose its power at that time

输出
-1

说明
表示给定的单词 to 在文章中没有出现,输出整数-1。

题目分析:

第一眼看到这道题的时候想到的用stringstream,可以分开单词进行判断,但这道题不同单词之间的空格是没有办法判断的,所以在输出第几个单词的时候会出现问题(如果每个单词之间只有一个空格的话还好)。

所以关于字符串的题,还是按照正规的办法来做就可以了(又不是让你把每个单词的首字母都换成大写字母),只是限定条件注意一下就可以了,这道题不是很难。

这道题用到了toupper函数,如果不会使用的话,自己按照自己的办法来解决大小写问题即可。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cctype>
using namespace std;

int main ()
{
    string a,b;

    getline(cin,a);
    getline(cin,b);

    int len1=a.length();
    int len2=b.length();

    int flag;
    int sum=0;
    int panduan;

    for (int i=0;i<len2;i++)
    {
        flag=1;

        if( (i!=0 && b[i-1]!=' ') || b[i+len1]!=' ')   continue;

        for (int j=0;j<len1;j++)
        {
            if( toupper(b[i+j]) != toupper(a[j]) )
            {
                flag=0;
                break;
            }
        }



        if(flag==1)
        {
            sum++;
            if(sum==1)
            {
                panduan=i;
            }
        }
    }
    if(sum!=0)cout << sum << " " << panduan << endl;
    else cout << "-1" << endl;
}