学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++ | 汇总-CSDN博客
【题目描述】
回文字符串是一个正读和反读都一样的字符串,比如 “
l
e
v
e
l
level
level”、“
n
o
o
n
noon
noon” 都是回文串,而 “
a
b
c
a
abca
abca”、“
T
x
t
Txt
Txt” 不是回文串。
给定一个字符串
s
s
s,请问能否添加或删除一个字符之后使得
s
s
s 是一个回文字符串,注意必须进行一次删除或者添加操作,不能不做任何操作。
现在小猴手里有
q
q
q个字符串
s
s
s,需要你帮助小猴判断这些字符串中那些字符串能够通过添加或删除一个字符之后变为回文串。
【输入】
第一行,包含一个整数
q
q
q;
接下来
q
q
q 行,每行包含一个字符串
s
s
s,保证
s
s
s 中只包含大小写字母和数字。
【输出】
q
q
q 行,第
i
i
i行输出一个结果,如果第
i
i
i 个字符串
s
i
s_i
si 可以通过修改变为回文串,输出
Y
e
s
Yes
Yes,否则输出
N
o
No
No。
【输入样例】
2
Tom
java
【输出样例】
No
Yes
【代码详解】
#include <bits/stdc++.h>
using namespace std;
bool isPal(string s)
{
for (int i=0; i<s.size()/2; i++) {
if (s[i]!=s[s.size()-i-1]) {
return false;
}
}
return true;
}
int main()
{
int q;
cin >> q;
while (q--) { // 遍历q次询问
string s;
cin >> s;
int n = s.size(), i; // 获取字符串长度n
for (i=0; i<n/2; i++) { // 先找到第一个不相同的位置,可以处理前一个或者后一个
if (s[i]!=s[n-i-1]) break;
}
if (i==n/2 || isPal(s.substr(i,n-2*i-1)) || (isPal(s.substr(i+1,n-2*i-1)))) { // 开始就是回文或者删除后1个后变成回文或者删除前1个后变成回文
cout << "Yes" << endl;
}else { // 否则
cout << "No" << endl;
}
}
return 0;
}
【运行结果】
2
Tom
No
java
Yes