欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > P10905 [蓝桥杯 2024 省 C] 回文字符串

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

2025/4/7 15:56:02 来源:https://blog.csdn.net/2501_91282886/article/details/147014122  浏览:    关键词:P10905 [蓝桥杯 2024 省 C] 回文字符串

题目描述

小蓝最近迷上了回文字符串,他有一个只包含小写字母的字符串 S,小蓝可以往字符串 S 的开头处加入任意数目个指定字符:lqb(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们自己举例,便于理解(^▽^)

#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,直接输出 Yescout << "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 {  // 否则输出 Nocout << "No" << endl;}}}}return 0;  // 结束程序
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词