openjudge 1.12.5 统计单词数

OpenJudge - 05:统计单词数


解题思路:

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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值