題目:
給定一個包含大寫字母和小寫字母的字符串,找到通過這些字母構造成的最長的迴文串。
在構造過程中,請注意區分大小寫。比如 "Aa"
不能當做一個迴文字符串。
輸入: "abccccdd" 輸出: 7 解釋: 我們可以構造的最長的迴文串是"dccaccd", 它的長度是 7。
思路:可以觀察到迴文字符串具有對稱性,即從中間切開,左右兩邊的元素的個數總是偶數對出現。該問題實際上1可以轉化爲統計原字符串元素的出現次數爲奇數的個數,因爲剩下的出現偶數次的字符串都可以湊成一個迴文字符串。但是要注意迴文子串可包含一個出現奇數次的元素,將它放在中間,依然是迴文字符串。這就是後面計算結果時爲何原長度減去元素出現次數爲奇數的個數的時候要+1的原因。
代碼:
class Solution:
def longestPalindrome(self, s: str) -> int:
times=collections.Counter(s).values()
#求出s元素中每個元素出現的次數
num=0
#num記錄出現次數爲奇數的元素個數
length=len(s)
for i in times:
if i%2!=0:
num+=1
ans=length-num
return ans+1 if num>0 else ans