原题链接:字符序列模式识别
解题思路:首先注意本题的条件,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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复