一、题目概述
题目传送门
给你一个单词,和一篇文章,请你回答这个单词的出现次数,和这个单词的第一个字母所在的位置,若没出现过输出-1。
二、思路
其实可以暴力直接做只不过有亿点点麻烦,所以可以用字符串查找。若不会字符串查找的戳我
int Search(string s , string p){
int pos = s.find(p) , cnt = 0;
while(pos != -1){//其实若没有在s里找到p应该返回s.npos,转为int后等于-1
cnt++;
pos = s.find(p , pos + 1);//查找下一个
}
return cnt;
}
而文章里有空格可以用getline输入
getline(cin , s);
getline(cin , p);
文章和单词大小写不分可以都转为小写
void small_letter(string &s){
int len = s.size();
for(int i = 0; i < len; i++){
if(s[i] >= 'A' && s[i] <= 'Z'){
s[i] += 'a' - 'A';
}
}
return;
}
三、重点
但是若这个单词出现在一个单词里,就会查找到更多不必要查到的单词,所以我们可以在文章和单词两边加上一个空格即可
s = " " + s + " ";
p = " " + p + " ";
四、AC CODE
#include <bits/stdc++.h>
using namespace std;
string p , s;
void small_letter(string &s){
int len = s.size();
for(int i = 0; i < len; i++){
if(s[i] >= 'A' && s[i] <= 'Z'){
s[i] += 'a' - 'A';
}
}
return;
}
int Search(string s , string p){
int pos = s.find(p) , cnt = 0;
while(pos != -1){
cnt++;
pos = s.find(p , pos + 1);
}
return cnt;
}
int main(){
getline(cin , p) , getline(cin , s);
small_letter(p) , small_letter(s);
s = " " + s + " " , p = " " + p + " ";
int ans = Search(s , p);
if(ans == 0) cout << -1;
else cout << ans << " " << s.find(p);
return 0;
}