708 字
3 分钟阅读
回文挑战
题目描述
判断一个字符串是否为回文串。如果这个字符串不是回文串,求是否可以最多删除一个字符,可得到一个回文串,如果可以则输出Yes,反之则输出No。
回文字符串是指正读和反读都一样的字符串。例如level、deed、radar都是回文字符串,因为它们从左到右和从右到左读都是相同的。
输入格式
单行输入一个字符串,其字符串的长度不超过 1000 。
输出格式
如过这个字符串本就是回文字符串,则直接输出Yes。如果它初始时不是回文串,则判断是否满足最多删除一个字符,使其成为回文字符串,如果该操作成立,则输出Yes,若该操作做不到,则输出No。
输入样例 1
abac
输出样例 1
Yes
输入样例 2
abbba
输出样例 2
Yes
输入样例 3
abbcd
输出样例 3
No
题意
删掉任意一个字符,能否使剩下的字符串是一个回文串。
思路
枚举删掉的字符位置,复制一份原字符串,在新的字符串中用erase删掉这个位置的字符,然后判断是不是回文串,是就标记合法,如果枚举完所有位置后仍然没有合法的回文串,则输出No,如果有合法的,则输出Yes。
代码
bool check(string s){
int l = 0;
int r = s.size() - 1;
while(l <= r){
if(s[l] != s[r]){
return false;
}
l++;
r--;
}
return true;
}
void solve(){
string s;
cin >> s;
bool ok = false;
for(int i = 0;i < s.size();i++){
string now = s;
now.erase(i,1);
if(check(now)){
ok = true;
}
}
cout << (ok ? "Yes" : "No");
}

[…] 回文挑战 题解 […]