Python編程題25--最長迴文串的長度

題目

給定一個僅包含大寫字母和小寫字母的字符串,找到通過這些字母構造成的最長的迴文串。

注意:在構造過程中,字符串的字母可以按隨意順序組合成一個迴文串,但需區分大小寫,比如 "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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章