题目描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章
中的某一独立单词在不区分大小写的情况下完全相同,如果给定单词仅是文章中某一单词的一部分则不算匹配。
输入输出格式
输入格式:
共22行。
第11行为一个字符串,其中只含字母,表示给定单词;
第22行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式:
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从00 开始);如果单词在文章中没有出现,则直接输出一个整数-1−1。
题目解析:
难点:
1.字符串相同的部分在文章中是否为一个独立的单词(判断标准,相同部分相邻两边是否全部为空格)
2.短字符串与长字符串的比较
3.首次出现位置的确认
解决方法:
1." "+word+" "作为查询单词,这样可以查询单词的同时判定是否符合独立单词的标准
2.对于长字符串中的每个字符,设置bool变量f=1,遍历循环查询单词word,如果字符不符合,f=0,break跳出循环
3.word[j]!=words[i+j],如语句,不改变i的值,通过j值的改变来影响words的循环,在判定单词符合要求的同时,得到i位置
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
string word,words,p,s;
getline(cin,p);
getline(cin,s);
word=' '+p+' ';
words=' '+s+' ';
int i,j=0,count=0,adres=-1,f;
transform(word.begin(),word.end(),word.begin(),::tolower);
transform(words.begin(),words.end(),words.begin(),::tolower);
for(i=0;i<words.length();i++){
f=1;
j=0;
while(j<word.length()){
if(word[j]!=words[i+j]){
f=0;
break;
}
j++;
}
if(f){
if(adres==-1) adres=i;
count++;
}
}
if(adres!=-1) cout<<count<<" "<<adres;
else cout<<adres;
}