解题思路:首先注意本题的条件,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分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论