刷题日记 1332. 删除回文子序列

111 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

一、题目描述:

1332. 删除回文子序列 - 力扣(LeetCode)

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

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

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

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

示例 1:

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

示例 2:

输入:s = "abb"
输出:2
解释:"abb" -> "bb" -> "". 
先删除回文子序列 "a",然后再删除 "bb"

示例 3:

输入:s = "baabb"
输出:2
解释:"baabb" -> "b" -> "". 
先删除回文子序列 "baab",然后再删除 "b"

提示:

    • 1 <= s.length <= 1000
    • s 仅包含字母 'a'  和 'b'

二、思路分析:

这题解法就是循环遍历字符串

将第一个字母与最后一个字母比对判断是否相等

第二个字母与倒数第二个字母比对,以此类推

如果比对时两个字母不相等,就表示这个字符串本身不是回文,则将所有的a作为一个子序列

所有的b作为另一个子序列,就可以做到将任何字符串删除两次就可以删除所有字符

因为题目要求字符串只有ab两个字母,所以return 2(表示删除两次)

那么循环结束也没有return 2就表示这个字符串本身就是回文,所以只删除一次,就return 1。

三、AC 代码:

class Solution {
public:
    int removePalindromeSub(string s) {
        //将第一个字母与最后一个字母比对判断是否相等,第二个字母与倒数第二个字母比对,以此类推
        for(int i = 0; i < s.size(); i++)
        {
            //如果比对时不相等,就表示这个字符串本身不是回文,则将所有的a作为一个子序列,所有的b作为另一个子序列,就可以做到将任何字符串删除两次就可以删除所有字符,所以return 2
            if(s[i] != s[s.size() - i  - 1])
            {
                return 2;
            }
        }
        //循环结束也没有return就表示这个字符串本身就是回文
        return 1;
    }
};

四、总结:

想了半小时想出了一个思路,但是代码没打出来。一看官方答案懵了,只有几行代码,那么简单吗?然后发现答案的解释和代码看不懂,我又看了其他人的答案,终于懂了。原来我没理解子序列是啥意思,这题解题关键就在于子序列可以不连续。