Hailin Code - 字符串
type: channel
link: https://lincodex.cn/index.php/tag/string/
items: 回文字符串

回文字符串
type: item
date: 2026-03-26T14:56:00+08:00
description: 蓝桥杯2024省赛-回文字符串题目描述给定一个只包含小写字母的字符串 S，可以在字符串的开头加入任意数目的指定字符 l、q、b。问是否能通过这种方式将 S 转化为一个回文字符串。输入格式第一行一个整数 T，表示数据组数。 接下来 T 行，每行一个字符串 S。输出格式输出 T 行，每行 Yes 或 No。样例输入：3 gmgqlq pdlbll aaa输出：Yes No Yes解题思路核心思想由于只能在开头添加字符，因此：如果字符串本身是回文，直接输出 Yes否则，从两端向中间比较：如果两端字符相等，继续向中间移动如果不相等，检查右边字符是否属于 {l, q, b}，如果是，则跳过该字符（相当于在开头补了相同的字符），继续比较否则，无法构成回文双指针模拟def check(s): i, j = 0, len(s) - 1 while i < j: if s[i] == s[j]: i += 1 j -= 1 else: # 右边字符是指定字符，跳过（相当于在左边补了它） if s[j] in {'l', 'q', 'b'}: j -= 1 else: return False return True复杂度分析时间复杂度：O(|S|)，每组数据只需一次遍历空间复杂度：O(1)完整代码import os import sys letter = {'l', 'q', 'b'} t = int(input()) def check(s): i, j = 0, len(s) - 1 while i < j: if s[i] == s[j]: i += 1 j -= 1 else: if s[j] in letter: j -= 1 else: return False return True for _ in range(t): s = input() if s == s[::-1]: print('Yes') else: print('Yes' if check(s) else 'No')样例解释gmgqlq：右边字符 q 跳过（补 q），得到 qgmgqlq 是回文 ✅pdlbll：右边字符 l 跳过，但之后仍无法匹配，最终返回 False ❌aaa：本身是回文 ✅