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
代碼支持: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