708 字
3 分钟阅读
回文挑战

题目描述

判断一个字符串是否为回文串。如果这个字符串不是回文串,求是否可以最多删除一个字符,可得到一个回文串,如果可以则输出Yes,反之则输出No
回文字符串是指正读和反读都一样的字符串。例如leveldeedradar都是回文字符串,因为它们从左到右和从右到左读都是相同的。

输入格式

单行输入一个字符串,其字符串的长度不超过 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");
}

1 条评论

  1. 2026年贵工程寒假训练题解 – 追求的个人博客 2026年1月17日

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

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注