题目描述
一个字符串是回文串,当且仅当该字符串从前往后读和从后往前读是一样的,例如,aabaa 和 ccddcc 都是回文串,但 abcd 不是。
小杨有 n 个仅包含小写字母的字符串,他想请你编写程序判断每个字符串是否由两个长度至少为 2 的回文串前后拼接而成。
输入格式
第一行包含一个正整数 n,代表字符串数量。
接下来 n 行,每行一个仅包含小写字母的字符串。
输出格式
对于每个字符串输出一行,如果该字符串由两个长度至少为 2 的回文串前后拼接而成则输出 Yes,否则输出 No。
输入输出样例
输入 #1
4 abcd aabbb aaac abcdd
输出 #1
No Yes No No
说明/提示
样例 1 解释
对于第 1,3,4 个字符串,都不是由两个长度至少为 2 的回文串前后拼接而成。 第 2 个字符串由回文串 aa 和 bbb 前后拼接而成,并且两个回文串长度都至少为 2。
不使用reverse函数:
#include<iostream>
#include<string>
using namespace std;
int main() {
int a;
cin>>a;
for(int i=0;i<a;i++){
string str;
cin>>str;
if(str.size()<4) cout<<"No"<<endl;
else{
bool out = false;
for(int j=2;j<=str.size()-2;j++){
bool result=true;
for(int k=0;k*2<j;k++){//k到j为左侧回文字符串 不包j
//cout<<"A:"<<k<<str[k]<<" "<<j-k-1<<str[j-k-1]<<endl;
if(str[k]!=str[j-k-1]) {//首尾对比
result=false;
break;
}
}
if(result){
for(int k=j;(k-j)*2<str.size()-j-1;k++){//j到str.size()-1为右侧回文字符串
//cout<<k<<"B:"<<k<<str[k]<<" "<<str.size()-1-k+j<<str[str.size()-1-k+j]<<endl;
if(str[k]!=str[str.size()-1-k+j]){//首尾对比
result=false;
break;
}
}
}
if(result) {
cout<<"Yes"<<endl;
out=true;
break;
}
}
if(!out) cout<<"No"<<endl;
}
}
}
1418

被折叠的 条评论
为什么被折叠?



