P1308 [NOIP2011 普及组] 统计单词数

大家好呀,今天又回来啦,因为我的电脑最近因为亿些个人原因被家长封了。
今天的这篇文章也会被列入《无聊的题解》,但这道题并不无聊。
先来传送门:传送门
不要被是一个普及组的题所难到,其实就是一个查找数组的知识么。
这次要用的C++库:

bits/stdc++.h里的<iostream><string><algorithm>

函数:

getline()
tolower()
cin
cout
string::npos
main(void) or main(int argc, char **argv)

可能少有不准,请dalao多多指教
开始讲解:
先敲出头文件什么的:

#include<bits/stdc++.h>
using namespace std;
int main(){}

主体来了哟
1、先输入。{
说说getline()。
ta的用法:
getline(加标准输入(cin), 变量名字);

cin呢?
cin >> 变量名;
}
2、说说变量:{
这里要用到string变量。
格式:string 变量名;
}

所以应该这样:

#include<bits/stdc++.h>
using namespace std;
int main(){
	string tstring, findstring;           //两个字符串变量。原字符串和要寻找的字符串
	getline(cin, findstring);             //题目要求先输入目标字符串
	getline(cin, tstring);}               //输入原字符串

输入搞完了,讲一下思路
Step No.1:{
1、先把所有的字符串都改成小写字母(为了方便比较)(要是都换成大写也不反驳,思路都是一样的)

#include<bits/stdc++.h>
using namespace std;
int main(){
	string tstring, findstring;          //两个字符串变量。原字符串和要寻找的字符串
	getline(cin, findstring);            //题目要求先输入目标字符串
	getline(cin, tstring);               //输入原字符串
	for(int i = 0;i < findstring.length();i ++) findstring[i] = tolower(findstring[i]);                  //这里有一个函数:是 字符串变量名.length()/size()是读取这个字符串的字符长度(个数)这里用 tolower(int c)函数进行小写化,也可以用toupper(int c)大写化
	for(int i = 0;i < tstring.length();i ++) tstring[i] = tolower(tstring[i]);}                   //同理

}
Step No.2:{
把两个字符串两边加上空格。
原因1:因为要找的是一个单词,如果不加空格就会有出错
原因2:在tstring上加空格是害怕出现指向错误的报警

#include<bits/stdc++.h>
using namespace std;
int main(){
	string tstring, findstring;          //两个字符串变量。原字符串和要寻找的字符串
	getline(cin, findstring);            //题目要求先输入目标字符串
	getline(cin, tstring);               //输入原字符串
	for(int i = 0;i < findstring.length();i ++) findstring[i] = tolower(findstring[i]);                  //这里有一个函数:是 字符串变量名.length()/size()是读取这个字符串的字符长度(个数)这里用 tolower(int c)函数进行小写化
	for(int i = 0;i < tstring.length();i ++) tstring[i] = tolower(tstring[i]);                    //同理
	tstring = ' ' + tstring + ' ';      //加空格
	findstring = ' ' + findstring + ' ';}//同理

Step No.3:收尾!{
刚刚讲完了上面,算法也不难。
只需一个:

在string库里的 string::npos;

这个是判断字符串有没有找到,通常与(字符串变量.find(字符串或变量)搭配使用)
1、算法【
主要就是找又没有符合目标字符串的。

这个是剩下的代码:

if(tstring.find(findstring) == string::npos){                   //不能找到
	cout << "-1";                                               //输出-1
}else{                                                          //找到了
	int ala = tstring.find(findstring);                         //两个变量,一个记录第一次出现的,一个计算的
	int bet = tstring.find(findstring);
	int sum = 0;                                                //计数的
	while(bet != string::npos){
		sum ++;
		bet = tstring.find(findstring, bet + 1);               //逐个排查
	}
	cout << sum << ' ' << ala;                                //出来啦!
}

}
No.4{
整理:
没有注释的代码:

#include<bits/stdc++.h>
using namespace std;
int main(void){
string tstring, findstring;
getline(cin, findstring);
getline(cin, tstring);
for(int i = 0;i < tstring.length();i ++){
tstring[i] = tolower(tstring[i]);
}
for(int i = 0;i < findstring.length();i ++){
findstring[i] = tolower(findstring[i]);
}
tstring = ' ' + tstring + ' ';
findstring = ' ' + findstring + ' ';
if(tstring.find(findstring) == string::npos){
cout << "-1";
}else{
int ala = tstring.find(findstring);
int bet = tstring.find(findstring);
int sum = 0;
while(bet != string::npos){
sum ++;
bet = tstring.find(findstring, bet + 1);
}
cout << sum << ' ' << ala;
}
return 0;
}

有注释的代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	string tstring, findstring;          //两个字符串变量。原字符串和要寻找的字符串
	getline(cin, findstring);            //题目要求先输入目标字符串
	getline(cin, tstring);               //输入原字符串
	for(int i = 0;i < findstring.length();i ++) findstring[i] = tolower(findstring[i]);                  //这里有一个函数:是 字符串变量名.length()/size()是读取这个字符串的字符长度(个数)这里用 tolower(int c)函数进行小写化
	for(int i = 0;i < tstring.length();i ++) tstring[i] = tolower(tstring[i]);                    //同理
	tstring = ' ' + tstring + ' ';      //加空格
	findstring = ' ' + findstring + ' ';//同理
	if(tstring.find(findstring) == string::npos){                   //不能找到
	cout << "-1";                                               //输出-1
	}else{                                                          //找到了
		int ala = tstring.find(findstring);                         //两个变量,一个记录第一次出现的,一个计算的
		int bet = tstring.find(findstring);
		int sum = 0;                                                //计数的
		while(bet != string::npos){
			sum ++;
			bet = tstring.find(findstring, bet + 1);               //逐个排查
		}
		cout << sum << ' ' << ala;                                //出来啦!
	}
	return 0;                                                               //加上return是个好习惯
}

}
No.5{
测评结果:
两个代码都是:
通过了
}

预告:
下一个文章讲如何搞一个动态壁纸

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Antarctic Airlines

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值