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