【LeetCode每日一题】1332:删除回文子序列

223 阅读2分钟

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

LeetCode每日一题打卡专栏正式启动!不出意外将日更LeetCode的每日一题,敬请期待。

1332:删除回文子序列

题意

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

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

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

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

示例1:

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

示例2:

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

示例2:

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

提示:

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

题解:简单思维

题目给定s只包含字母a和b,于是可以知道:

  • 如果原串是回文串,则只需要一次操作即可
  • 如果原串不是回文串,则最差的情况可以为先移除所有的a,再移除所有的b,只需要两次

于是只需判断原串是否为回文串即可。

C++代码:

class Solution {
public:
    int removePalindromeSub(string s) {
        int n=s.length();
        for(int i=0;i<n;i++){
            if(s[i]!=s[n-i-1]) return 2;
        }
        return 1;
    }
};

Java代码:

class Solution {
    public int removePalindromeSub(String s) {
        char[] str=s.toCharArray();
        for(int i=0;i<s.length();i++){
            if(str[i]!=str[s.length()-i-1]) return 2;
        }
        return 1;
    }
}