洛谷B2118-2122和B2124
B2118
题目:
给出两个字符串,看看一个字符串是否为另一个字符串的子串
收获:
就是找子串啊,不是找子序列,利用stl中的find函数
易错:
1.子串必须是连续的,而子序列不一定要连续
2.getline可以读\r回车符,故该题没有限定读入都是大小写字母,所以可能产生错误,最好还是用cin,在不要求读入空格的情况下
#include<bits/stdc++.h>
using namespace std;
int main(){
string a,b;
// getline(cin,a);
// getline(cin,b);
cin>>a>>b;
if(a.find(b)!=a.npos){//npos就是找不到的意思
cout<<b<<" is substring of "<<a;
}//b含于a,则b是a的子串
else if(b.find(a)!=b.npos){
cout<<a<<" is substring of "<<b;
}//a含于b,则a是b的子串
else{
cout<<"No substring";
}
return 0;
}
B2119:
题目:删除某个字符串的后缀
收获:利用erase删除字符串中某些位置的字符
摘抄:string::erase( pos , len ) : 从第 pos 个位置开始,擦除之后的len 个字符。
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
int l=s.length();
if(s[l-1]=='r'&&s[l-2]=='e')s.erase(l-2,2);
else if(s[l-1]=='y'&&s[l-2]=='l')s.erase(l-2,2);
else if(s[l-1]=='g'&&s[l-2]=='n'&&s[l-3]=='i')s.erase(l-3,3);
cout<<s;
return 0;
}
B2124
题目:判断字符串是否回文
方法:reverse一下,看看是否和原来的字符串相等即可
#include <bits/stdc++.h>
using namespace std;
int main() {
string a,b;
cin>>a;
b=a;
reverse(a.begin(),a.end());
if(a==b) cout<<"yes";
else cout<<"no";
return 0;
}
B2120//B2122
题目:判断一个长字符串中小字符串的长度(翻转)
方法:while(cin>>s)依次读取每一个小字符串
收获:
1.reverse是个函数啊,不能直接进行输出呵==>即不能cout<< reverse(s.begin(),s.end())<<endl;
2.如何截取一个长字符串中,小字符串的性质
3.输出存在循环,需要进行特判(循环为','长度)
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
bool flag = true;
while (cin >> s) {
if (flag) {
flag = false;//特判一下
cout << s.size();
} else {
cout << ',' << s.size();
}
}
return 0;
}//B2120
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
while(cin>>s){
reverse(s.begin(),s.end());
cout<<s<<endl;
}
return 0;
}//B2122
B2121
题目:记录一个长字符串中最短的字符串与最长的字符串
区分:与B2120和B2122区分,该题小字符串相隔可能不是空格,也有可能是','
思路:每一小节都记录他们的长度,最大和最小长度,并记录好最大长度,最小长度所对应的字符串即可;只记录第一个==>直接可以想是否可以开bool数组呢?但是要记录全局的最大长度与最小长度啊,开bool数组只是部分与其违背了?故开bool数组这个思路就不太好了==>则采取新思路==>取到最大值时,直接标记最大值字符串的下标
#include<bits/stdc++.h>
using namespace std;
int sum=0,maxx=-1,minn=20000000;
int temp1,temp2;
int main(){
string a;
getline(cin,a);
int l=a.length();
for(int i=0;i<l;i++){
if(a[i]==' '||a[i]==','||a[i]=='.'){
if(sum>maxx){
maxx=sum;//记录最长的字符串的长度;
temp1=i;//记录下最长的字符串结束的下一个位置
}
if(sum<minn){
minn=sum;//记录下最短字符串的长度
temp2=i;//记录下最短的字符串结束的下一个位置
}
sum=0;//恢复
}//标志一个字符串结束
else{
sum++;
}
}
for(int i=temp1-maxx;i<temp1;i++){
cout<<a[i];
}
cout<<endl;
for(int i=temp2-minn;i<temp2;i++){
cout<<a[i];
}
return 0;
}