解题思路:
1.由题可得,有两个字符串a和b,a为被查找的单词,b为被查找的句子,在忽略大小写的情况下,判断b中含有几个a,并输出a第一次出现首单词的位置
2.因为b字符串含有空格,所以a和b都用getline的方法获取字符串,并且遇到这种情况,都要使用两个getline的方法获取
3.对于a和b字符串进行预处理,前后都加上空格,便于统一处理,这里注意,对于string字符串的操作,可以直接加上字符,如b=' 'b+' ';如果想要加上字符串的方式,那么定义字符串c=" ";b=c+b+c不能直接b=" "+b+" ";
4.然后对于字符串a和b都进行大写转化为小写字母,开始遍历字符串b,如果该位置的字符b[i]==a[1];即字符串a的首字母如果和该位置相等的话,判断前一位和最后一位是否为空格,如果是,说明这个单词是独立的,不是被包含在别的单词中,那么开始判断,里面的每一项,设置一个check函数,有返回值的含参函数,比较剩余字符是否相等,如果相等的话,返回1,否则返回0
5.如果判断结果为1的话,那么计数器累加,表示单词的出现数量加1,然后打标记,记录第一次出现的位置,注意要-1,因为b字符串加上了空格,所以改变了原来的位置
6.如果没有找到这个单词的话,输出-1
#include<bits/stdc++.h>
using namespace std;
string a,b;
bool check(int x)
{
for(int i=2;i<=a.length()-2;i++)//因为后面多加了一个空格,所以不用判断最后一位
{
if(a[i]==b[x+i-1])//如果对应位置上的字符相等,则继续
continue;
else//否则输出错误
return false;
}
return true;
}
int main()
{
bool flag=0;
int sum=0,ans;
getline(cin,a);
getline(cin,b);
a=' '+a+' ';//首尾都加上空格,便于统一处理
b=' '+b+' ';
for(int i=0;i<=a.length()-1;i++)//将字符串ab都转化为小写字母
{
if(a[i]>='A'&&a[i]<='Z')
a[i]=a[i]+32;
}
for(int i=0;i<=b.length()-1;i++)
{
if(b[i]>='A'&&b[i]<='Z')
b[i]=b[i]+32;
}
for(int i=1;i<=b.length()-1;i++)
{
if(b[i]==a[1])//判断如果b中字符串的某个字符和a[1]相等
if(b[i-1]==' '&&(b[i+a.length()-2]==' '))//判断这个下标的前一位和目标单词的后一位是否为空格
if(check(i))//如果都满足,并且各个位上是否一致
{
sum++;//单词数加1
if(flag==0)//存储第一次出现的位置
{
ans=i-1;//因为前面加了空格,所以要减一
flag=1;//打标记,只记录第一次出现的位置
}
}
}
if(flag==0)
cout<<-1;
else
cout<<sum<<" "<<ans;
return 0;
}