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

Part 0 前言

这是一道思考难度比较大的题,我前后改了七次才过,特此纪念。

Part 1 思路

先读题,题意大致为给定一个字符串,能在字符串的前面添加数个 lqb 三个字符,问能不能构成回文字符串。

我们可以将原字符串(长度为 l e n len len)分为三段:

第一段,只包含题目中给出的三个特殊字符且在原字符串的最前方的字串,设长度为 l e n 1 len1 len1

第二段,只包含题目中给出的三个特殊字符且在原字符串的最后方的字串,设长度为 l e n 2 len2 len2

第三段,第二段和第一段之间的子串,设长度为 l e n 3 len3 len3

例如字符串 lqbkkklqbkkklqb,第一段为 lqb,长度为 3 3 3;第二段为 kkklqbkkk,长度为 9 9 9;第三段为 lqb,长度为 3 3 3

分情况讨论,若 l e n 1 ≤ l e n 2 len1 \leq len2 len1len2,那么从 0 0 0 开始,遍历到 l e n − l e n 2 + l e n 1 − 1 len-len2+len1-1 lenlen2+len11,判断这个区间内是否回文,若回文,则答案为 Yes,否则答案为 No

l e n 1 > l e n 2 len1 > len2 len1>len2,那么可以证得,永远不可能回文,答案为 No

Part 2 AC code

#include<bits/stdc++.h>
using namespace std;
string s;
int len;
int get_len_front(){
	int sum=0;
	for(int i=0;i<len;i++){
		if(s[i]=='l'||s[i]=='q'||s[i]=='b') sum++;
		else break;
	}
	return sum;
}//获取len1
int get_len_back(){
	int sum=0;
	for(int i=len-1;i>=0;i--){
		if(s[i]=='l'||s[i]=='q'||s[i]=='b') sum++;
		else break;
	}
	return sum;
}//获取len2
int main(){
	int t;
	cin>>t;
	while(t--){
		cin>>s;
		len=s.length();
		int len1=get_len_front();
		int len2=get_len_back();
		if(len1==len2&&len1==len){
			cout<<"Yes\n";
			continue;
		}//若整个字符串都为特殊字符,那么将原串倒序拼在前面即可,所以答案为Yes
		int bj=1;
		if(len1<=len2){
			for(int i=0;i<len-len2+len1-1;i++){
				if(s[i]!=s[len-len2+len1-1-i]){
					cout<<"No\n";bj=0;break;
				}//判断是否回文
			}
			if(bj) cout<<"Yes\n";
		}
		else
		{
			cout<<"No\n";
		}
	}
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值