C/C++实现洛谷P1308 [NOIP2011 普及组] 统计单词数 题目(题解)

在这道题上想了好几天,冥(借)思(阅)苦(题)想(解)之后恍然大悟,没想到还能这样操作

假如要在"toto tototo to toto to"中匹配单词"to",仔细一想这代码估计挺复杂的

但是我们已知:

1.必须完整匹配单词"to",像"toto"这种就不行

2.每个单词之间用空格隔开

由此我们可以不匹配"to"而是前后都有一个空格的"_to_"(为了显示明显我这里用_代替空格)

这样就可以直接用find函数直接查找,不必担心是否完全匹配的问题

但是要注意:

我们也要在待匹配的长字符串的开头和结尾各加上一个空格:"_toto tototo to toto to_"

因为像末尾的to如果后面没有空格的话那跟"_to_"匹配不上了就

以下便是完整代码:

#include<iostream>
#include<string>

using namespace std;

int main() {
	string c;//要匹配的字符串
	string s;//待匹配的长字符串
	cin >> c;
	getchar();//把\n从缓冲区取出,防止getline直接跳过
	getline(cin, s);//读取一行待匹配的长字符串
	
	//这俩循环是将俩字符串都统一改成全小写
	for (int i = 0; i < c.length(); i++)
	{
		c[i] = tolower(c[i]);
	}
	for (int i = 0; i < s.length(); i++)
	{
		s[i] = tolower(s[i]);
	}

	//都各自在前后加一个空格
	c = " " + c + " ";
	s = " " + s + " ";

	//先find一下有没有
	if (s.find(c) == string::npos) {
		cout << -1;//没有就直接输出了
	}
	else {//有的话就开始找
		int firstPos = s.find(c);//记录第一次出现的位置
		int pos = firstPos;
		int cnt = 0;//统计完全匹配次数
		while (pos!=string::npos)
		{
			cnt++;
			pos = s.find(c, pos + 1);
		}
		cout << cnt << " " << firstPos;
	}

	return 0;
}

 注意不要想着在找第一次出现位置时用 find_first_of 函数,因为他是不完全匹配,我就是当时没记清,导致总共就俩AC的,还debug了半天QAQ

猜你喜欢

转载自blog.csdn.net/qq_55149044/article/details/134536204