原题链接:字符序列模式识别
解题思路:首先注意本题的条件,1、子串大小为0<s<1000,那么两个串大小最大为999+999=1998,最小为1+1=2,再加上中间&字符,所以整个串长度为3<=s<=1999;2、第二个判断,如果s长度为偶数肯定不对,3、如果s长度是奇数,那么需要判断最中间字符是否为&。所以三个条件可以组合为
if(n>=2000||n<3||n%2==0||(n%2!=0&&str[n/2]!='&')) return 0;
因为题目是判断两边子串是否逆相同,所以我们可以采取循环两个下标从字符串两头开始对比,循环语句可以这样写,先给出两个下标一个开头一个结尾,同时题目要求全是小写字母,所以可以这样写,要求字母是小写字母且前后下标逐个扫描判断相等。取反,如果有一个不符合,那么返回0;
for(int i=0,j=n-1;i<n/2;i++,j--)
if(!(str[i]>='a'&&str[i]<='z'&&str[j]>='a'&&str[j]<='z'&&str[i]==str[j])){
return 0;
}以上全部执行完,如果没有返回0,那么返回1,说明该字符串符合要求
注意事项:条件的编写容易遗漏
参考代码:
#include<iostream>
#include<cstring>
using namespace std;
int sb(char str[]){
int n=strlen(str);
if(n>=2000||n<3||n%2==0||(n%2!=0&&str[n/2]!='&'))
return 0;
for(int i=0,j=n-1;i<n/2;i++,j--){
if(!(str[i]>='a'&&str[i]<='z'&&str[j]>='a'&&str[j]<='z'&&str[i]==str[j])){
return 0;
}
}
return 1;
}
int main(){
char s[2005];
while(cin.getline(s,2005)){
if(sb(s))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复