【LeetCode日记】 1332. 删除回文子序列

题目地址(1332. 删除回文子序列)

https://leetcode-cn.com/problems/remove-palindromic-subsequences/python

题目描述

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

「子序列」定义:若是一个字符串能够经过删除原字符串某些字符而不改变原字符顺序获得,那么这个字符串就是原字符串的一个子序列。

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

 

示例 1:

输入:s = "ababa"
输出:1
解释:字符串自己就是回文序列,只须要删除一次。
示例 2:

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

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

输入:s = ""
输出:0
 

提示:

0 <= s.length <= 1000
s 仅包含字母 'a'  和 'b'
在真实的面试中遇到过这道题?

思路

这又是一道“抖机灵”的题目,相似的题目有1297.maximum-number-of-occurrences-of-a-substringgit

因为只有 a 和 b 两个字符。其实最多的消除次数就是 2。由于咱们不管如何均可以先消除所有的 1 再消除所有的 2(先消除 2 也同样),这样只须要两次便可完成。 咱们再看一下题目给的一次消除的状况,题目给的例子是“ababa”,咱们发现其实它自己就是一个回文串,因此才能够一次所有消除。那么思路就有了:github

  • 若是 s 是回文,则咱们须要一次消除
  • 不然须要两次
  • 必定要注意特殊状况, 对于空字符串,咱们须要 0 次

代码

代码支持:Python3面试

Python3 Code:code

class Solution:
    def removePalindromeSub(self, s: str) -> int:
        if s == '':
            return 0
        def isPalindrome(s):
            l = 0
            r = len(s) - 1
            while l < r:
                if s[l] != s[r]:
                    return False
                l += 1
                r -= 1
            return True
        return 1 if isPalindrome(s) else 2

若是你以为判断回文不是本题重点,也能够简单实现:leetcode

Python3 Code:rem

class Solution:
    def removePalindromeSub(self, s: str) -> int:
        if s == '':
            return 0
        return 1 if s == s[::-1] else 2

关键点解析

  • 注意审题目,必定要利用题目条件“只含有 a 和 b 两个字符”不然容易作的很麻烦
相关文章
相关标签/搜索