解题思路:
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
- 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<
" "< - return 0;
- }