回文字符串
蓝桥杯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:本身是回文 ✅