大家好呀,今天又回来啦,因为我的电脑最近因为亿些个人原因被家长封了。
今天的这篇文章也会被列入《无聊的题解》,但这道题并不无聊。
先来传送门:传送门。
不要被是一个普及组的题所难到,其实就是一个查找数组的知识么。
这次要用的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{
测评结果:
两个代码都是:
}
预告:
下一个文章讲如何搞一个动态壁纸