【LeetCode日記】 1332. 刪除迴文子序列

題目地址(1332. 刪除迴文子序列)

https://leetcode-cn.com/probl...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 兩個字符」不然容易作的很麻煩
相關文章
相關標籤/搜索