GESP三级20240902真题(回文拼接)

题目描述

一个字符串是回文串,当且仅当该字符串从前往后读和从后往前读是一样的,例如,aabaa 和 ccddcc 都是回文串但 abcd 不是。
小杨有几个仅包含小写字母的字符串,他想请你编写程序判断每个字符串是否由两个长度至少为2的回文串前后拼接而成。

输入描述 

第一行包含一个正整数 n,代表字符串数量。
之后n行每行一个仅包含小写字母的字符串。

输出描述

对于每个字符串输出一行,如果该字符串由两个长度至少为2的回文串前后拼接而成则输出 Yes,否则输出 No

样例输入 1 

4
abcd
aabbb
aaac
abcdd

样例输出 1 

No
Yes
No
No

代码

#include <bits/stdc++.h>
using namespace std;
bool hws(string a){//判断字符串是否是回文
    int c;
    string str="",str1="";
    c=a.length()-1;
    for(char b:a){
        str1+=a[c];
        c--;
    }
 return str1==a;
}
int main(){
    int a,s=1;
    bool flag=false;
    string b,str="";
    cin>>a;
    for(int i=1;i<=a;i++){
        cin>>b;
        if(b.length()<4){
            cout<<"No"<<endl;
            continue;
        }
        for(int j=1;j<b.length()-1;j++){
            str=b.substr(0,s);//截取字符串
            if(hws(str)){
                b.erase(0,s);
                if(hws(b)){
                    flag=true;
                    break;
                }
            }
            else{
                s++;
                continue;
            }
        }
        if(flag){
            cout<<"Yes"<<endl;
        }
        else{
            cout<<"No"<<endl;
        }
        flag=false;
        s=1;
    }
 return 0;
}

解释
对于第 1,3,4个字符串,都不是由两个长度至少为2的回文串前后拼接而成。
第2个字符串由回文串 aa 和 bbb 前后拼接而成,并且两个回文串长度都至少为 2。
对于全部数据,保证有1≤n≤10,并且每个字符串的长度不超过 100。

### GESP202409 三级 回文拼接 题目解析 #### 定义与背景 一个字符串被称为回文串,当且仅当该字符串从前往后读和从后往前读是一样的[^3]。例如,“aabaa” 和 “ccddcc” 是回文串,而 "abcd" 则不是。 #### 问题描述 给定 n 个仅包含小写字母的字符串,需要编写程序来判断这些字符串是否可以被分解成两个长度至少为 2 的回文子串,并且这两个回文子串首尾相连形成原字符串[^1]。 #### 解题思路 为了验证某个字符串能否拆分为两个符合条件的回文部分,可以通过遍历所有可能的位置 i 来尝试分割字符串 s 成两半: - 左边的部分是从索引位置 `0` 至 `i-1`; - 右边的部分则是从索引位置 `i` 开始直到字符串结尾; 对于每一个这样的划分方式,分别检验这两段是不是有效的回文串。如果存在任何一个合法的划分,则返回 True 表明此字符串满足条件;反之则继续寻找其他可能性直至完成全部检查为止。 #### 实现方案 下面是一个 Python 函数实现上述逻辑的方法: ```python def is_palindrome(s, start, end): while start < end: if s[start] != s[end]: return False start += 1 end -= 1 return True def can_split_into_two_palindromes(s): n = len(s) for i in range(2, n): left_part = s[:i] right_part = s[i:] if len(left_part) >= 2 and len(right_part) >= 2 \ and is_palindrome(left_part, 0, len(left_part)-1)\ and is_palindrome(right_part, 0, len(right_part)-1): return True return False ``` 这段代码定义了一个辅助函数 `is_palindrome()` 来检测指定范围内的字符序列是否构成回文结构。主函数 `can_split_into_two_palindromes()` 接收单个输入参数——待处理的目标字符串,并通过循环迭代测试不同的切割点以查找是否存在合适的组合使得整个字符串能够按照要求进行分割。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值