蓝桥杯P19718-回文字符串 题解
回文字符串
题目来源:7.回文字符串 - 蓝桥云课
题目描述
输入一个字符串后,在开头加入 l
、q
、b
三个指定字符。判断处理后的字符串是否为回文字符串。
输入格式:
- 第一行输入一个整数
n
,表示接下来有n
个字符串需要判断。 - 接下来的
n
行,每行一个字符串。
输出格式:
- 对每个字符串输出一行,如果是回文字符串输出
Yes
,否则输出No
。
示例:
输入:
3
aba
xyz
racecar
输出:
Yes
No
Yes
解题思路
-
题目理解:
- 回文字符串是指正读和反读都相同的字符串,例如
"aba"
、"racecar"
。 - 题目要求在输入字符串开头加入
l
、q
、b
,但提供的代码中并未体现这一点,可能是题目描述或代码实现存在歧义。 - 代码的实际逻辑是:输入字符串后,先判断是否为回文,如果不是,则尝试从末尾删除字符
l
、q
、b
,再判断是否为回文。
- 回文字符串是指正读和反读都相同的字符串,例如
-
实现步骤:
- 对于每个输入的字符串:
- 先直接判断是否为回文。
- 如果不是回文,从字符串末尾开始检查,如果遇到
l
、g
、b
,则删除该字符,并再次判断是否为回文。 - 输出结果:是回文输出
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;
}
代码分析
-
函数
isHuiWen
:- 输入一个字符串,检查其是否为回文。
- 使用双指针思想,从两端向中间比较字符,若发现不相等则返回
false
。
-
主函数逻辑:
- 使用
n
控制循环次数,逐个处理输入的字符串。 - 对于每个字符串,先调用
isHuiWen
判断。 - 如果不是回文,从末尾开始遍历,删除
l
、q
、b
并再次判断。 - 优化:如果遇到非
l
、q
、b
的字符,立即停止删除,避免无意义的遍历。
- 使用
-
输入输出优化:
ios::sync_with_stdio(0)
和cin.tie(0)
用于加速 C++ 的输入输出,适用于大规模数据。
时间复杂度与空间复杂度
-
时间复杂度:
- 判断回文:
O(n)
,其中n
是字符串长度。 - 删除字符并判断:最坏情况下每次删除后都判断回文,复杂度为
O(n^2)
。 - 总复杂度:
O(n^2)
(对每个字符串)。
- 判断回文:
-
空间复杂度:
O(1)
(不考虑输入字符串本身的空间,只使用常数额外空间)。