题目描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )。
输入输出格式
输入格式:
共22行。
第11行为一个字符串,其中只含字母,表示给定单词;
第22行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式:
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从00 开始);如果单词在文章中没有出现,则直接输出一个整数−1−1。
输入输出样例
输入样例#1:
To to be or not to be is a question
输出样例#1:
2 0
输入样例#2:
to Did the Ottoman Empire lose its power at that time
输出样例#2:
-1
说明
数据范围
1≤1≤单词长度≤10≤10。
1≤1≤文章长度≤1,000,000≤1,000,000。
noip2011普及组第2题
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
string w,s;
int main()
{
getline(cin,w);
getline(cin,s);//用getline()读入整行字符串
int l1=s.size(),l2=w.size(),t1=0,t2;//l1为句子的长度,l2为单词的长度
int i,j;
for(i=0;i<=l1-l2;i++)//i为句子的第i个字符
{
for(j=0;j<l1-1;j++)//从句子的第i个字符开始与单词的字符逐个比较
{
if(toupper(s[i+j])!=toupper(w[j]))
break;
if(i>0&&s[i-1]!=' ')
break;
}//若句子和单词的字符相等,就要查看空格,看句子中该串字符的前后是否都是空格,以保证相等的小字符串在句子中是以独立的单词形式出现的
if((j==l2&&s[i+j]==' ')||j+i==l1)
{
t1++;//若满足所有的条件,就累加满足条件的单词数
if(t1==1) t2=i;//用t2标记第一次出现满足条件的单词的首字母的下标
}
}
if(t1==0) cout<<"-1\n";
else cout<<t1<<" "<<t2;
return 0;
}
补充:
函数tolower()是将大写字母转换为小写字母;
函数toupper()是将小写字母转换为大写字母。