LeetCode 1332. 删除回文子序列

103 阅读2分钟

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

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'

2.分析

统计字符a和字符b的频率。分情况讨论: 如果都是0,说明空串,直接返回0 如果有一个为空, 返回1,说明已经是同一个字母构成的palindrome 如果两个都不为空,说明a,b都有。此时如果字符串本身是palindrome,返回1,否则,需要两次操作,第一次删除所有的a构成的回文,第二次删除所有的b构成的回文。

3.AC代码

class Solution {
public:
    int removePalindromeSub(string s) {
        int countA = 0;
        int countB = 0;
        for (const auto& ch : s) {
            countA += ch == 'a';
            countB += ch == 'b';
        }
        
        if (countA == 0 && countB == 0) {
            return 0;
        } else if (countA == 0 || countB == 0) {
            return 1;
        } else {
            if (s == string(s.rbegin(), s.rend())) {
                return 1; // already a palindrome
            }
            return 2;
        }
    }
};

4.参考

【🐼熊猫刷题Python3】不要慌,是子序列!(坑人的文字游戏...) - 删除回文子序列 - 力扣(LeetCode)

fk 写了个子字符串的玩意 搞到三点了 睡觉去 - 删除回文子序列 - 力扣(LeetCode)