小民喜欢和同学玩查找单词游戏,游戏规则是这样的:同学任意给定一个单词,他想知道该单词在某一文章中出现的次数和第一次出现的位置,小民说这个问题很容易用程序解决。请你帮助小民编程求解该问题。
说明:文章中首字母的位置为0,以此类推。如果单词在文章中没有出现,则输出整数
-1.
注意:单词匹配时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2)。
【输入形式】
共2行。
第1行为一个字符串,其中只含字母(大小写字母都有可能),表示给定单词;
第2行为一个字符串,其中只可能包含字母(大小写字母都有可能)和空格,表示给定
的文章。【输出形式】
1行,包含两个整数,两个整数之间用一个空格隔开,表示给定单词在给定文章中出现的次数和第一次出现的位置。
输入样例1:
To
You have to jump high to play this sport 输出样例1
2 9
输入样例2
sun
You Are My Sunshine
输出样例2
-1
分析:首先将给定的单词 word 与文章都转换为小写字母,再调用 string 类的 find 函数,从 pos =0位置处查找给定的单词,如果 find 函数调用的返回值 ret 为﹣1,则直接输出﹣1,否则单词数加1,记录单词第一次出现的位置 first ,并修改 pos = ret + word . length ()-1,重复以上步骤,不断循环调用 find 函数,直到返回值为﹣1。
#include<stdio.h>
#include<string.h>
int main(){
int t=0,p=-1,i=0,n=0;
char s1[1000],s2[1000],c;
scanf("%s",s1);
while(getchar()!='\n');
for(i=0;i<strlen(s1);i++){
if(s1[i]>='a' && s1[i]<='z')s1[i]-='a'-'A';
}
s1[i]='\0';
do{
c=getchar();
n++;
if(c>='a' && c<='z')c-='a'-'A';
if(c==' '||c=='\n'){
s2[i++]='\0';
if(strcmp(s1,s2)==0){
if(p==-1)p=n-i;
t++;
}
i=0;
}else{
s2[i++]=c;
}
}while(c!='\n');
if(t>0){
printf("%d %d",t,p);
}else{
printf("%d",-1);
}
return 0;
}
可以使用以下代码来解决这个问题:
// 将给定的单词和文章都转换为小写字母
string word = tolower(word);
string article = tolower(article);
// 定义变量
int count = 0;
int first = -1;
int pos = 0;
// 循环查找
while (true) {
int ret = article.find(word, pos);
if (ret == -1) {
break;
}
count++;
if (first == -1) {
first = ret;
}
pos = ret + word.length() - 1;
}
// 输出结果
cout << count << " " << first << endl;