当前位置: 首页 > article >正文

蓝桥杯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)(不考虑输入字符串本身的空间,只使用常数额外空间)。

http://www.kler.cn/a/576871.html

相关文章:

  • GET3D:从图像中学习的高质量3D纹理形状的生成模型
  • Bolt AI 技术浅析(五):实时编辑
  • C++20 DR11:数组 `new` 可以推导出数组大小
  • 常见的 Git 命令
  • Python 远程抓取服务器日志最后 1000行
  • c# 2025/3/8 周六
  • 网络运维学习笔记(DeepSeek优化版) 013网工初级(HCIA-Datacom与CCNA-EI)ACL访问控制列表
  • JAVA Spring Boot @Bean 注解的使用和注意事项
  • 【每日学点HarmonyOS Next知识】Tab切换声明周期、复杂Json组装、scroll最大高度、引用传递报错、Web性能
  • saltstack通过master下发脚本批量修改minion_id,修改为IP
  • 递归专题刷题
  • 大模型工程师学习日记(十五):Hugging Face 模型微调训练(基于 BERT 的中文评价情感分析)
  • Python写一个查星座的小程序,适合初学者练手——字典和if语句练习
  • ARMV8的64位指令
  • cdn取消接口缓存
  • Redis 各数据类型使用场景详解
  • Scaling Laws for Neural Language Models
  • DIY Tomcat:手写一个简易Servlet容器
  • HTTPS安全通信协议原理
  • 什么是 Java 的 Timer?