左右對稱 Longest Palindrome 最長的回文字串長度 Leetcode #409

更新於 發佈於 閱讀時間約 5 分鐘

題目敘述 Longest Palindrome

給定一個字串s,以s擁有的字元製造回文字串。
請問能製造出的回文字串長度最長是多少


測試範例

Example 1:

Input: s = "abccccdd"
Output: 7
Explanation: One longest palindrome that can be built is "dccaccd", whose length is 7.
'dccaccd', 'cdcacdc','ccdadcc'

'dccbccd', 'cdcbcdc','ccdbdcc'
最大長度都是7

Example 2:

Input: s = "a"
Output: 1
Explanation: The longest palindrome that can be built is "a", whose length is 1.

最大長度就是'a'本身,也是回文字串。​

約束條件

Constraints:

  • 1 <= s.length <= 2000

字串s的長度介於1~2000之間。

  • s consists of lowercase and/or uppercase English letters only.

字串s只會有大寫、小寫英文字母。


觀察

回文字串不外乎兩種模式

對稱部分 + 核心字元 + 對稱部分,其中,核心字元在正中央出現一次

或者

對稱部分 + 對稱部分


那麼,我們可以推理得知,只要是偶數出現次數的字元,一定可以均勻分布在左右兩側形成對稱部分,進一步構成回文字串。

如果有出現奇數次的字元,就任意挑一個去當核心字元,扣掉核心那次,剛好又變成偶數出現次數,又可以均勻分布在左右兩側形成對稱部分,進一步構成回文字串。


演算法 統計出現次數

承接觀察點的思考。

凡是出現偶數次的字元,一定可以構成回文字串。

凡是出現奇數次的字元,任意挑一個去當核心字元,扣掉核心那次,剛好又變成偶數出現次數,又可以均勻分布在左右兩側形成對稱部分,進一步構成回文字串。

# 表達在這個敘述
(odd_counts > 0)


其他沒有被挑到的奇數次字元,都各自捨棄一次出現機會,剛好都變成偶數出現次數,又可以均勻分布在左右兩側形成對稱部分,進一步構成回文字串。

# 表達在這個敘述
total_length - odd_counts

程式碼 統計出現次數

class Solution:
def longestPalindrome(self, s: str) -> int:

total_length = len(s)
odd_counts = sum(1 for char, occurrence in Counter(s).items() if (occurrence & 1) )

# First, we can choose one character from odds as center of palindrome
# For example, 'bbabb' or 'bab'.

# If all characters are of even occurrence, then put them on left-hand side and right-hand side evenly.
# For example, 'bbbffbbb'

# Second, for each characters with odd occurrence, discard one character of its own to make it with even occurrence (therefore they can be palindrome always)
# For example, 'aaa' -> 'aa', 'ccccc' -> 'cccc'

return (odd_counts > 0) + total_length - odd_counts

複雜度分析

時間複雜度: O(n)

掃描過每個字元,統計出現數,總共耗時O(n)。


空間複雜度: O(26*2) = O(1)

題目已經說只會有大寫、小寫英文字母,那麼字典最多只會占用O(26*2)的空間,為常數級別O(1)。


關鍵知識點

回文字串不外乎兩種模式

對稱部分 + 核心字元 + 對稱部分,其中,核心字元在正中央出現一次

或者

對稱部分 + 對稱部分


從回文字串模式推理出盡可能充分利用每個字元的回文字串製造方法


Reference

[1] Longest Palindrome - LeetCode

avatar-img
91會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
給定一個二維的二元矩陣,計算正方形的最大面積。利用DP演算法及最大化正方形邊長的方法,遍歷矩陣,釐清DP初始狀態並推導出DP狀態轉移關係式。複雜度分析說明了時間複雜度和空間複雜度。關鍵知識點是找出最大的正方形邊長。
Append Characters to String to Make Subsequence 給定兩個字串s和字串t。 請計算最少的字元串接數量是多少,串接在s的尾端,使得t是s的子序列。 測試範例 Example 1: Input: s = "coaching", t =
通過 取捨與否的最佳策略 來獲得 最高的分數。文章中運用了類似House Robbery的DP模型來解決這個問題。通過演算法化簡的技巧,將這個問題化簡到 相鄰物不可同時選擇的DP模型。同時,強烈建議同時複習House Robbery,熟悉DP演算法框架和掌握演算法化簡的技巧。
了解如何使用in-place原位操作及O(1)常數空間的演算法來反轉給定的字串陣列。藉由雙指針演算法,每回合對調左右兩個指針對應到的字元,並且逐漸往中心靠攏,由外而內進行反轉。詳細的演算法與複雜度分析也在文章中呈現。
動態規劃Dynamic Programming其實是 一種泛用的演算法思考方式與演算法建構框架。 動態規劃並不拘束於只能解課本上特定的的範例題。 只要我們能找出DP狀態定義、DP遞迴結構、初始條件(終止條件),就能適用動態規劃來解題,以數學的形式表達,並且在紙筆上或者電腦上、計算機上計算
本文章討論如何使用動態規劃和回頭查看技巧來計算最長遞增子序列的長度,並提供了相關的測試案例和範例。本文還包括了詳細的演算法和程式碼示例,以及時間和空間複雜度的分析。
給定一個二維的二元矩陣,計算正方形的最大面積。利用DP演算法及最大化正方形邊長的方法,遍歷矩陣,釐清DP初始狀態並推導出DP狀態轉移關係式。複雜度分析說明了時間複雜度和空間複雜度。關鍵知識點是找出最大的正方形邊長。
Append Characters to String to Make Subsequence 給定兩個字串s和字串t。 請計算最少的字元串接數量是多少,串接在s的尾端,使得t是s的子序列。 測試範例 Example 1: Input: s = "coaching", t =
通過 取捨與否的最佳策略 來獲得 最高的分數。文章中運用了類似House Robbery的DP模型來解決這個問題。通過演算法化簡的技巧,將這個問題化簡到 相鄰物不可同時選擇的DP模型。同時,強烈建議同時複習House Robbery,熟悉DP演算法框架和掌握演算法化簡的技巧。
了解如何使用in-place原位操作及O(1)常數空間的演算法來反轉給定的字串陣列。藉由雙指針演算法,每回合對調左右兩個指針對應到的字元,並且逐漸往中心靠攏,由外而內進行反轉。詳細的演算法與複雜度分析也在文章中呈現。
動態規劃Dynamic Programming其實是 一種泛用的演算法思考方式與演算法建構框架。 動態規劃並不拘束於只能解課本上特定的的範例題。 只要我們能找出DP狀態定義、DP遞迴結構、初始條件(終止條件),就能適用動態規劃來解題,以數學的形式表達,並且在紙筆上或者電腦上、計算機上計算
本文章討論如何使用動態規劃和回頭查看技巧來計算最長遞增子序列的長度,並提供了相關的測試案例和範例。本文還包括了詳細的演算法和程式碼示例,以及時間和空間複雜度的分析。
你可能也想看
Google News 追蹤
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
看到題目問「種類」時,集合就是你最好的朋友。
  嗯……這篇是類疊跟設問的場合。也是快變成國文課的場合。 ❈❈❈   ※類疊法:   接二連三地反覆使用相同的一個字詞、語句。可增加文章的節奏感,凸顯文章的重點。   讓句型更加生動,避免枯燥,任何詞性都可以被重疊。名詞重疊常表示數量龐大;動詞重疊表示動作的進行;形容詞或副詞的重疊表示委婉
Thumbnail
在比賽裡這就是大家拚手速的題目了,準備好了嗎?
Thumbnail
接下來喜特先生會介紹一系列關於文字處理時,會常常運用到的函式。我們這次先從比較簡單的 LEN、CHAR 和 REPT 開始,之後會陸續介紹其他的。如果你有什麼想要了解的函式,歡迎在下面留言告訴我! LEN:字元長度 我們可以用 LEN 函式取得儲存格或字元的長度。 語法相當簡單:
Thumbnail
有個簡單的方法,把儲存格的文字串連起來!一起來看看怎麼做,很好操作唷!
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
看到題目問「種類」時,集合就是你最好的朋友。
  嗯……這篇是類疊跟設問的場合。也是快變成國文課的場合。 ❈❈❈   ※類疊法:   接二連三地反覆使用相同的一個字詞、語句。可增加文章的節奏感,凸顯文章的重點。   讓句型更加生動,避免枯燥,任何詞性都可以被重疊。名詞重疊常表示數量龐大;動詞重疊表示動作的進行;形容詞或副詞的重疊表示委婉
Thumbnail
在比賽裡這就是大家拚手速的題目了,準備好了嗎?
Thumbnail
接下來喜特先生會介紹一系列關於文字處理時,會常常運用到的函式。我們這次先從比較簡單的 LEN、CHAR 和 REPT 開始,之後會陸續介紹其他的。如果你有什麼想要了解的函式,歡迎在下面留言告訴我! LEN:字元長度 我們可以用 LEN 函式取得儲存格或字元的長度。 語法相當簡單:
Thumbnail
有個簡單的方法,把儲存格的文字串連起來!一起來看看怎麼做,很好操作唷!