蓝桥杯P19718-回文字符串 题解

回文字符串

题目来源:7.回文字符串 - 蓝桥云课

题目描述

输入一个字符串后,在开头加入 lqb 三个指定字符。判断处理后的字符串是否为回文字符串。

输入格式:

  • 第一行输入一个整数 n,表示接下来有 n 个字符串需要判断。
  • 接下来的 n 行,每行一个字符串。

输出格式:

  • 对每个字符串输出一行,如果是回文字符串输出 Yes,否则输出 No

示例:

输入:
3
aba
xyz
racecar

输出:
Yes
No
Yes

解题思路

  1. 题目理解:

    • 回文字符串是指正读和反读都相同的字符串,例如 "aba""racecar"
    • 题目要求在输入字符串开头加入 lqb,但提供的代码中并未体现这一点,可能是题目描述或代码实现存在歧义。
    • 代码的实际逻辑是:输入字符串后,先判断是否为回文,如果不是,则尝试从末尾删除字符 lqb,再判断是否为回文。
  2. 实现步骤:

    • 对于每个输入的字符串:
      1. 先直接判断是否为回文。
      2. 如果不是回文,从字符串末尾开始检查,如果遇到 lgb,则删除该字符,并再次判断是否为回文。
      3. 输出结果:是回文输出 Yes,不是输出 No

完善后的代码

以下是修正并补充注释后的代码:

#include<iostream>
#include<string>
using namespace std;

// 判断是否为回文字符串
bool isHuiWen(string s) {
    int n = s.size();
    for(int i = 0; i < n / 2; i++) {
        if(s[i] != s[n - 1 - i]) {
            return false;  // 如果对称位置字符不相等,不是回文
        }
    }
    return true;  // 全部对称相等,是回文
} 

int main() {
    ios::sync_with_stdio(0);  // 加速输入输出
    cin.tie(0); 
    cout.tie(0);
    
    int n;
    cin >> n;  // 输入字符串数量
    string s;
    for(int i = 0; i < n; i++) {
        cin >> s;  // 输入当前字符串  
        if(!isHuiWen(s)) {  // 如果不是回文,尝试从末尾删除 l、g、b
            for(int j = s.length() - 1; j >= 0; j--) {
                if(s[j] == 'l' || s[j] == 'q' || s[j] == 'b') {  
                    s.erase(j, 1);  // 删除末尾的 l、q、b
                    if(isHuiWen(s)) break;  // 删除后若成为回文,跳出循环
                } else {
                    break;  // 遇到非 l、q、b 字符,停止删除
                }
            }
        }
        
        // 输出结果
        if(isHuiWen(s)) cout << "Yes" << endl;
        else cout << "No" << endl;
    }
    
    return 0;
}

代码分析

  1. 函数 isHuiWen

    • 输入一个字符串,检查其是否为回文。
    • 使用双指针思想,从两端向中间比较字符,若发现不相等则返回 false
  2. 主函数逻辑:

    • 使用 n 控制循环次数,逐个处理输入的字符串。
    • 对于每个字符串,先调用 isHuiWen 判断。
    • 如果不是回文,从末尾开始遍历,删除 lqb 并再次判断。
    • 优化:如果遇到非 lqb 的字符,立即停止删除,避免无意义的遍历。
  3. 输入输出优化:

    • ios::sync_with_stdio(0)cin.tie(0) 用于加速 C++ 的输入输出,适用于大规模数据。

时间复杂度与空间复杂度

  • 时间复杂度:

    • 判断回文:O(n),其中 n 是字符串长度。
    • 删除字符并判断:最坏情况下每次删除后都判断回文,复杂度为 O(n^2)
    • 总复杂度:O(n^2)(对每个字符串)。
  • 空间复杂度:

    • O(1)(不考虑输入字符串本身的空间,只使用常数额外空间)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王嘉俊925

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值