一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配, 即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例 11), 如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例 22)。
输入格式
第 11 行为一个字符串,其中只含字母,表示给定单词;
第 22 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式
只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字 母在文章中的位置,位置从 00 开始);如果单词在文章中没有出现,则直接输出一个整数 -1−1。
数据范围
1 \le1≤ 单词长度 \le 10≤10。
1 \le1≤ 文章长度 \le 1,000,000≤1,000,000。
样例说明
样例1:
输出结果表示给定的单词 To 在文章中出现两次,第一次出现的位置为 00 。
样例2:
表示给定的单词 to 在文章中没有出现,输出整数 -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
这一题利用string 的库函数,可以说是很魔幻的操作了。。。特别注意,如果用getline,那么for判断的时候用 j<len ;同时在更新pos的位置的时候,一定只要记录第一次位置,同时,不可以用find来查找substr,这样就不符合题意;代码如下:
/*
@author:HaiRu,WU
@from:AHUT
*/
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
int main(){
string substr;
string str;
cin >> substr;
getchar();
getline(cin,str);
//将两个字符串分别转为小写
transform(substr.begin(),substr.end(),substr.begin(),::tolower);
transform(str.begin(),str.end(),str.begin(),::tolower);
int pos=-1;
int i=0;
int len=str.length();
int ans=0;
while(i<len){
string model;
int j;
for(j=i;str[j]!=' '&&j<len;j++){
model+=str[j];
}
if(model==substr){
if(pos==-1){ //记录第一次出现的位置
pos=i;
}
ans++;
}
i=j+1;
}
if(ans==0){
cout<<-1<<endl;
}else{
cout<<ans<<" "<<pos<<endl;
}
return 0;
}