P10905 [蓝桥杯 2024 省 C] 回文字符串

题目描述

小蓝最近迷上了回文字符串,他有一个只包含小写字母的字符串 S,小蓝可以往字符串 S 的开头处加入任意数目个指定字符:l、q、b(ASCII 码分别为:108、113、98)。小蓝想要知道他是否能通过这种方式把字符串 S 转化为一个回文字符串。

输入格式

输入的第一行包含一个整数 T,表示每次输入包含 T 组数据。

接下来依次描述 T 组数据。

每组数据一行包含一个字符串 S。

输出格式

输出 T 行,每行包含一个字符串,依次表示每组数据的答案。如果可以将 S 转化为一个回文字符串输出 Yes,否则输出 No。

输入输出样例

输入 #1复制

复制代码
3
gmgqlq
pdlbll
aaa

输出 #1复制

复制代码
Yes
No
Yes

说明/提示

【样例说明】

对于 gmgqlq,可以在前面加上 qlq => qlqgmgqlq 转化为一个回文字符串;

对于 pdlbll,无法转化为一个回文字符串;

对于 aaa,本身就是一个回文字符串。

【评测用例规模与约定】

对于 50% 的评测用例,1≤∣S∣≤1000,其中 ∣Sj​∣ 表示字符串 S 的长度;

对于所有评测用例,1≤T≤10,1≤∑∣S∣≤106。

代码解析:

任意字符串都可以拆成ABC三部分,A,C两部分是只由l,q,b组成的最长前缀字符串和最长后缀字符串

分以下情况讨论:

1.如果字符串仅有l,q,b组成,显然可行

2.看B部分,如果B部分不回文,那一定无法构成

3.如果B部分是回文字符串,那看A前面能否添一些字符构成C

那只要检验A的序列和C的前缀序列是否相等即可

可能会有点绕,建议uu们自己举例,便于理解(^▽^)

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

int q;
string temp;

int main()
{
    cin >> q;

    while (q--) {
        string s;
        cin >> s;
        int l, r;
        
        // 从右侧开始,找到第一个非 l/q/b 的字符
        for (r = s.size() - 1; r >= 0 && (s[r] == 'l' || s[r] == 'q' || s[r] == 'b'); r--);
        
        if (r < 0) {  // 如果字符串全部是 l/q/b,直接输出 Yes
            cout << "Yes" << endl;
        }
        else {
            // 从左侧找到非 l/q/b 字符的第一个位置
            for (l = 0; l < r && (s[l] == 'l' || s[l] == 'q' || s[l] == 'b'); l++);
            
            // 提取中间部分并检查是否是回文
            string temp = s.substr(l, r - l + 1);
            string rev_temp = temp;
            reverse(rev_temp.begin(), rev_temp.end());
            
            if (temp != rev_temp) {
                cout << "No" << endl;
            }
            else {
                // 从剩余的部分检查回文性
                for (; l >= 0 && r < s.size() && s[l] == s[r]; l--, r++);
                
                if (l == -1) {  // 如果回文检查成功
                    cout << "Yes" << endl;
                } else {  // 否则输出 No
                    cout << "No" << endl;
                }
            }
        }
    }
    
    return 0;  // 结束程序
}
相关推荐
共享家95278 分钟前
C语言-408
c语言·开发语言
单片机设计·······21 分钟前
【dz-1162】汽车前玻璃雨刮器设计
c++·单片机·嵌入式硬件
AI智讯中枢41 分钟前
高性能 C++ 实战 (五):perf+FlameGraph 火焰图生产实战,精准定位 CPU / 缓存 / 锁瓶颈,避坑 + 完整实操案例
linux·c++·性能调优·性能分析·perf·flamegraph·火焰图
繁华的地方不一定留下你的脚印1 小时前
C++ 算法与 ranges:用 find_if、transform 写清数据处理意图
开发语言·c++·算法
张小姐的猫1 小时前
【AI大模型接入SDK】 —— 前端页面 & 项目总结与拓展
前端·数据结构·数据库·c++·人工智能·chatgpt
AC赳赳老秦1 小时前
财报附注表格精准提取:OpenClaw 从 PDF 年报附注挖掘隐藏明细,补齐财务分析维度
java·汇编·c++·python·青少年编程·deepseek·openclaw
欧特克_Glodon1 小时前
OpenCV计算机视觉开发入门与实践(基于C++):专栏内容介绍及目录
c++·人工智能·opencv·计算机视觉
码匠许师傅2 小时前
【C++三方组件】Asio 下篇:C++20 协程版 TCP 客户端与服务端
c++·tcp/ip·c++20
ACP广源盛139246256732 小时前
接口适配方案选型|GSV6125@ACP HDMI2.0 转 Type‑C/DP1.4 桥接芯片工程评估
大数据·c语言·开发语言·硬件架构·硬件工程·国产芯片
一只旭宝2 小时前
【C++复习】四种类型转换 + 常见设计模式 + Redis/MySQL(后端面试复习完整版)
c++·redis·笔记·mysql·设计模式