LeetCode1332. 删除回文子序列(简单)

R e m o v e   P a l i n d r o m e   S u b Remove\ Palindrome\ Sub Remove Palindrome Sub

 

题目描述


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

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

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

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

题目分析


 

要点

 
只有’a’和’b’组成的字符串一定含有回文字符串,可得字符串组合仅有“回文字符串”、“回文子序列+回文子序列”和“回文子序列+单个字符”三种。
 

举例

 
列举观察

‘aab’ → \rightarrow ‘aa’ → \rightarrow ‘b’ → \rightarrow ’’,
‘aba’ → \rightarrow ‘aba’ → \rightarrow ’’’,
‘aabb’ → \rightarrow ‘aa’ → \rightarrow ‘bb’ → \rightarrow ’’,
‘aaba’ → \rightarrow ‘aba’ → \rightarrow ‘a’ → \rightarrow ’’,
‘ababb’ → \rightarrow ‘aba’ → \rightarrow ‘bb’ → \rightarrow ’’,
‘abaab’ → \rightarrow ‘baab’ → \rightarrow ‘a’ → \rightarrow ’’,

可得知,
1、当原字符串为回文字符串时,只需删除1次,即可得到空字符串。
2、当原字符串为非回文字符串时,只需删除2次,即可得到空字符串。
 
 

编程实现


 

Python3

 

class Solution:
    def removePalindromeSub(self, s: str) -> int:
    	"""
    	1、当字符串本身为回文字符串时,只需要删除1次
    	2、当字符串本身不为回文字符串时,只需要删除2次
    	"""
        return 1 if s == s[::-1] else 2
复杂度分析
  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n为字符串长度
  • 空间复杂度: O ( 1 ) O(1) O(1)
     

C++

class Solution {
public:
    int removePalindromeSub(string s) {
        int t = 1;
        for(int i=s.length()-1; i >= 0; i--){
            if(s[s.length()-1-i] != s[i]){
                t = 2;
                break;
            }
        }
        return t;
    }
};
复杂度分析
  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n为字符串长度
  • 空间复杂度: O ( 1 ) O(1) O(1)
     

C#

public class Solution {
    public int RemovePalindromeSub(string s) {
        int t = 1;
        for(int i=s.Length-1; i >= 0; i--){
            if(s[s.ength-1-i] != s[i]){
                t = 2;
                break;
            }
        }
        return t;
    }
}
复杂度分析
  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n为字符串长度
  • 空间复杂度: O ( 1 ) O(1) O(1)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值