409 最長回文串

2021-10-04 03:12:00 字數 1195 閱讀 7803

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

在構造過程中,請注意區分大小寫。比如 「aa」 不能當做乙個回文字串。

注意:假設字串的長度不會超過 1010。

示例 1:

輸入:「abccccdd」

輸出:7

解釋:我們可以構造的最長的回文串是"dccaccd", 它的長度是 7。

方法:貪心那麼我們如何通過給定的字元構造乙個回文串呢?我們可以將每個字元使用偶數次,使得它們根據回文中心對稱。在這之後,如果有剩餘的字元,我們可以再取出乙個,作為回文中心。

演算法對於每個字元 ch,假設它出現了 v 次,我們可以使用該字元 v / 2 * 2 次,在回文串的左側和右側分別放置 v / 2 個字元 ch,其中 / 為整數除法。例如若 「a」 出現了 5 次,那麼我們可以使用 「a」 的次數為 4,回文串的左右兩側分別放置 2 個 「a」。

如果有任何乙個字元 ch 的出現次數 v 為奇數(即 v % 2 == 1),那麼可以將這個字元作為回文中心,注意只能最多有乙個字元作為回文中心。在**中,我們用 ans 儲存回文串的長度,由於在遍歷字元時,ans 每次會增加 v / 2 * 2,因此 ans 一直為偶數。但在發現了第乙個出現次數為奇數的字元後,我們將 ans 增加 1,這樣 ans 變為奇數,在後面發現其它出現奇數次的字元時,我們就不改變 ans 的值了。

class

solution

int ans =0;

for(

int v:count)

}return ans;

}}

class

solution

(object):

deflongestpalindrome

(self, s)

:"""

:type s: str

:rtype: int

"""ans =

0 count = collections.counter(s)

for v in count.values():

ans += v //2*

2if ans %2==

0and v %2==

1:ans = ans +

1return ans

409 最長回文串

給定乙個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的回文串。在構造過程中,請注意區分大小寫。比如 aa 不能當做乙個回文字串。注意 假設字串的長度不會超過 1010。示例 1 輸入 abccccdd 輸出 7 解釋 我們可以構造的最長的回文串是 dccaccd 它的長度是 7。回文串...

409 最長回文串

題目 給定乙個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的回文串。在構造過程中,請注意區分大小寫。比如 aa 不能當做乙個回文字串。注意 假設字串的長度不會超過 1010。示例 1 輸入 abccccdd 輸出 7 解釋 我們可以構造的最長的回文串是 dccaccd 它的長度是 7。...

409 最長回文串

題目要求以及示例 給定乙個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的回文串。在構造過程中,請注意區分大小寫。比如 aa 不能當做乙個回文字串。注意 假設字串的長度不會超過 1010。示例 1 輸入 abccccdd 輸出 7 解釋 我們可以構造的最長的回文串是 dccaccd 它的...