1332. 删除回文子序列

192 阅读2分钟

「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战」。

题目描述

给你一个字符串 s,它仅由字母 'a' 和 'b' 组成。每一次删除操作都可以从 s 中删除一个回文 子序列。

返回删除给定字符串中所有字符(字符串为空)的最小删除次数。

「子序列」定义:如果一个字符串可以通过删除原字符串某些字符而不改变原字符顺序得到,那么这个字符串就是原字符串的一个子序列。

「回文」定义:如果一个字符串向后和向前读是一致的,那么这个字符串就是一个回文。

示例 1:

输入: s = "ababa"
输出: 1
解释: 字符串本身就是回文序列,只需要删除一次。

思路分析

由于字符串中只存在a和b,又因为子序列定义为

如果一个字符串可以通过删除原字符串某些字符而不改变原字符顺序得到,那么这个字符串就是原字符串的一个子序列,这代表我们可以跳着选字符组成一个字符串,所以我们可以先消除所有的a,再消除所有的b。那这种方式只需要操作两次,接下来我们只需要证明这个字符串是否最小操作次数不为1次即可。 即这个字符串不是回文字符串。

具体实现

int removePalindromeSub(string s) {
    for(int i = 0; i< s.size(); i ++){
        int j = s.size() - i - 1;
        if (j <= i){
            return 1;
        }
        if (s[i] != s[j]){
            return 2;
        }

    }
    return 2;
}

总结

这道题作为简单题其实并没有使用什么知识点,更像一个脑筋急转弯,我们不妨想下其他解答方式

int removePalindromeSub(string s) {
        string b = s;
        reverse(s.begin(), s.end()); 
        return s == b ? 1:2;
    }

比如上述通过翻转字符串与原字符串的方式比较的方式判断是否是回文字符串。