題目
給定一個僅包含大寫字母和小寫字母的字符串,找到通過這些字母構造成的最長的迴文串。
注意:在構造過程中,字符串的字母可以按隨意順序組合成一個迴文串,但需區分大小寫,比如 "Aa" 不能當做一個迴文字符串。
例如:
給定一個字符串:"abccccdd",返回結果:7
說明:上面字符構造的最長的迴文串是"dccaccd",其長度爲 7
實現思路1
- 用 res 表示最長迴文串的長度,用一個字典 tmp_dict 來統計字符串中每個字母出現的次數
- 遍歷字典,如果字母出現的次數 i_count 爲偶數,那麼說明這些字母都可以用於構造迴文串 res + i_count ;如果字母出現的次數 i_count 爲奇數,那麼最多隻能把 i_count - 1 個用於構造迴文串
- 最後判斷 res 是否與原字符串 s 的長度一致,如果 res 等於 s 的長度,則說明所有字母統計次數均爲偶數,直接返回 res 即可;如果 res 不等於 s 的長度,那麼說明必然存在 i_count 爲奇數,那麼最後還可將 1 個奇數字符作爲迴文串的中位字符
代碼實現
def longestPalindrome(s):
res, tmp_dict = 0, {}
for i in s:
tmp_dict[i] = tmp_dict.get(i) + 1 if tmp_dict.get(i) else 1
for i in tmp_dict:
i_count = tmp_dict.get(i)
res += i_count if i_count % 2 == 0 else i_count - 1
return res if res == len(s) else res + 1
實現思路2
- 用集合 tmp_set 表示字符串中的不重複字母
- 遍歷集合,利用Python的內置函數
count()
方法統計字母的出現個數,如果字母次數爲偶數,則添加到列表 even_list ,如果字母次數爲奇數,則只能向下取最大偶數個,並添加到列表 odd_list ; - 最後,利用Python的內置函數
sum()
方法直接對 even_list 和 odd_list 求和,同時需判斷 odd_list 是否爲空,如果爲空,那麼直接返回求和結果即可;如果不爲空,那麼表示最後還可取一個字母作爲迴文串的中位字符
代碼實現
def longestPalindrome(s):
tmp_set = set(s)
even_list = [s.count(i) for i in tmp_set if s.count(i) % 2 == 0]
odd_list = [s.count(i) - 1 for i in tmp_set if s.count(i) % 2 != 0]
if odd_list:
return sum(even_list) + 1 + sum(odd_list)
return sum(even_list) + sum(odd_list)