洛谷字符串板刷--入门3

洛谷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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

满月居于月空、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值