统计单词数(信息学奥赛一本通-T1400)

toupper()函数:将字符串中小写字母转化为大写字母

cin接收一个字符串,遇“空格”、“TAB”、“回车”就结束

getline(cin, 变量名)接收一个字符串,可以接收空格并输出,需包含“#include

题目大意:给一个单词,给一个句子,找该单词在句子中出现的次数与第一次在句子中出现的位置,不存在就输出-1(单词句子查找的时候不区分大小写)


#include 
using namespace std;
int main()
{
	//cin读取字符串遇到回车、空格、tab结束 
	string word, sentence;
	getline(cin, word);		//可以读取空格 
	getline(cin, sentence);
	
	//求出单词和该句子的长度 
	int len1 = word.size();
	int len2 = sentence.size();
	
	int i, j, ans = 0, location;
	
	//从句子的第一个字符与单词每个字符进行匹配 
	for(i = 0; i < len2; i ++ )
	{
		for(j = 0; j < len1; j ++ )
		{
			//如果该句子的字母与单词字母不匹配
			//toupper()函数是将字符串中的小写字母全部转化为大写字母 
			if(toupper(sentence[i + j]) !=  toupper(word[j]))	
				break;	
			//如果枚举到的该句子的那个字母(也是该单词的首字母),看他的前一个字符是不是空格,
			//如果不是空格也不是该句子的第一个字母,说明在句子中枚举到的字母是某个单词的中间,
			//不是一个独立的单词 ,因为这里的一旦确定i,再确定句子中是否存在该单词,长度都是
			//由j(即该单词的长度更新的) 
			if(i > 0 && sentence[i - 1] != ' ')	
				break;
		}
		
		//如果 j走完, 需要判断该单词是否处于该句子某个单词的内部
		//条件:该句子的下一个字符是空格或者此时句子也到了末尾 
		if(j == len1 && (sentence[i + j] == ' ' || i + j == len2))  
		{
			ans ++;
			if(ans == 1)	location = i;
		}
	}
	if(ans)
		cout << ans <<  ' ' << location << endl;
	else 
		cout << -1 << endl;
	return 0;
}

你可能感兴趣的:(思维,模拟,算法)