歡迎點擊「算法與編程之美」↑關注咱們!
算法
本文首發於微信公衆號:"算法與編程之美",歡迎關注,及時瞭解更多此係列文章。編程
問題描述app
給你一個字符串 s,它僅由字母 'a' 和 'b' 組成。每一次刪除操做均可以從 s 中刪除一個迴文 子序列。spa
返回刪除給定字符串中全部字符(字符串爲空)的最小刪除次數。.net
「子序列」定義:若是一個字符串能夠經過刪除原字符串某些字符而不改變原字符順序獲得,那麼這個字符串就是原字符串的一個子序列。orm
「迴文」定義:若是一個字符串向後和向前讀是一致的,那麼這個字符串就是一個迴文ip
示例 1:ci
輸入:s = "ababa"rem
輸出:1
解釋:字符串自己就是迴文序列,只須要刪除一次。
示例 2:
輸入:s = "abb"
輸出:2
解釋:"abb" -> "bb" -> "".
先刪除迴文子序列 "a",而後再刪除 "bb"。
示例 3:
輸入:s = "baabb"
輸出:2
解釋:"baabb" -> "b" -> "".
先刪除迴文子序列 "baab",而後再刪除 "b"。
示例 4:
輸入:s = ""
輸出:0
解決方案
這道題其實很簡單,最大的問題就是讀題。
題中要求的是子序列,但日常作題基本都是子串,並且題目中的示例刪除的都是子串,很容易誤導咱們。
迴文子序列和迴文子串的區別是:子串是字符串中連續的一個序列,而子序列是字符串中保持相對位置的字符序列,例如,"aaa"能夠是字符串"aaba"的子序列但不是子串。簡單的說就是子串必須連續,子序列不必定連續。
這樣的話這道題就很簡單,簡單分析一下:次數最多就是2,由於只有a和b,那麼咱們最多,第一次刪除一個,第二次刪除另外一個。另外就是自己就是迴文串,那就刪一次,自己是空的,就不用刪。
題目代碼:
class Solution: def removePalindromeSub(self, s: str) -> int: if s == '': return 0 elif s == s[::-1]: return 1 return 2 |
主 編 | 王文星
責 編 | 周茂林
where2go 團隊
長按識別二維碼關注咱們!
舒適提示:點擊頁面右下角「寫留言」發表評論,期待您的參與!期待您的轉發!
本文分享自微信公衆號 - 算法與編程之美(algo_coding)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。