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

更新於 2024/06/04閱讀時間約 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
90會員
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
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
丹尼遜健腦操®對稱塗鴉遊戲是一種獨特的藝術體驗,在雙手運動繪畫與創作的過程中,促進了全腦整合學習,提高視覺功能、空間知覺、動作表現、創意表達以及培養我們對內在的自省能力與對美感的欣賞。在丹尼遜健腦操®對稱塗鴉遊戲中,你將更懂的欣賞生活中的美,並享受在藝術創作過程中帶給我們的快樂。
Thumbnail
如果有設計師故意想要這樣的設計呢?他就不想要每扇窗長一樣,可以嗎?也可以啦~~~就是在視覺的感受不太好。
Thumbnail
上一篇文章:EXCEL 將儲存格多個資料快速整理成一欄 你一定不知道的神仙級功能-左右對齊有介紹到左右對齊的其中一個使用方式,這集一樣是左右對齊,但是,是在不同場景的應用。 場景1:如何將B欄中的3個資訊,姓名、年分、等第,整理到同一個儲存格 這種字數相同的,用左右對齊最適合了,大約5秒就解決,
Thumbnail
有一個資料,裡面包含了編號與姓名,但是很多內容都塞在同一個儲存格內,如果要把這些資料全部整理成一欄,那該怎麼做呢? 如果用土法煉鋼的方式,慢慢一個一個複製貼上,肯定需要貼超久的!! 其實EXCEL中有一個內建功能"左右對齊",一秒就取代這些複製貼上的動作了!! 也可以到YT看有字幕跟語
Thumbnail
四角大輔在他的書中提到「捨棄習慣的住處」,他說, 只要換個生活的場所、工作地點、常去的地方,就能以最簡單的方式拓展「全新的生活型態」,去見識原本看不見的東西、認識原本不會邂逅的人、接收原本不知道的價值觀......只要懷有「想要嘗試」嶄新生活方式的好奇,以及「絕對要實踐」的信念,人人都可以辦到。
Thumbnail
依照本來寫好的人生劇本,我現在人在美國的某一州,大約是冬季無雪,夏季無颶風的州吧。
Thumbnail
在2020的美國總統大選中,許多台灣的川普支持者,把歐美所有左傾的政治主張與團體全打成共產主義,或認為左派政治正確文化等於文革,在現在的網路輿論中,對於左與右原先的概念及定義已經造成混淆。因此這篇文希望從政治哲學的基本概念,簡單介紹左派與右派的光譜,與它們在動態歷史過程中演變。
Thumbnail
他總是莫名的堅持,烤土司一定要左右對稱從中間切開。 接著抹上奶油和果醬,然後優雅地拿起來吃。
Thumbnail
事實上,台灣的兩大政黨,國民黨是國家社會主義式的,民進黨是社會民主主義式的,而其他小政黨,尤其是以道德與良心做為號召的政黨都是極左的。所以台灣沒有左翼政黨是因為他們希望的共產主義烏托邦式政黨本來就不能存在了,他們才會說搞政治的都右翼。
左右左右 慢跑秀髮 左右左右 人生選擇 左右左右 飲者步伐 左右左右 落葉飄零 左右左右 愛與被愛 左右左右 日出日落
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
丹尼遜健腦操®對稱塗鴉遊戲是一種獨特的藝術體驗,在雙手運動繪畫與創作的過程中,促進了全腦整合學習,提高視覺功能、空間知覺、動作表現、創意表達以及培養我們對內在的自省能力與對美感的欣賞。在丹尼遜健腦操®對稱塗鴉遊戲中,你將更懂的欣賞生活中的美,並享受在藝術創作過程中帶給我們的快樂。
Thumbnail
如果有設計師故意想要這樣的設計呢?他就不想要每扇窗長一樣,可以嗎?也可以啦~~~就是在視覺的感受不太好。
Thumbnail
上一篇文章:EXCEL 將儲存格多個資料快速整理成一欄 你一定不知道的神仙級功能-左右對齊有介紹到左右對齊的其中一個使用方式,這集一樣是左右對齊,但是,是在不同場景的應用。 場景1:如何將B欄中的3個資訊,姓名、年分、等第,整理到同一個儲存格 這種字數相同的,用左右對齊最適合了,大約5秒就解決,
Thumbnail
有一個資料,裡面包含了編號與姓名,但是很多內容都塞在同一個儲存格內,如果要把這些資料全部整理成一欄,那該怎麼做呢? 如果用土法煉鋼的方式,慢慢一個一個複製貼上,肯定需要貼超久的!! 其實EXCEL中有一個內建功能"左右對齊",一秒就取代這些複製貼上的動作了!! 也可以到YT看有字幕跟語
Thumbnail
四角大輔在他的書中提到「捨棄習慣的住處」,他說, 只要換個生活的場所、工作地點、常去的地方,就能以最簡單的方式拓展「全新的生活型態」,去見識原本看不見的東西、認識原本不會邂逅的人、接收原本不知道的價值觀......只要懷有「想要嘗試」嶄新生活方式的好奇,以及「絕對要實踐」的信念,人人都可以辦到。
Thumbnail
依照本來寫好的人生劇本,我現在人在美國的某一州,大約是冬季無雪,夏季無颶風的州吧。
Thumbnail
在2020的美國總統大選中,許多台灣的川普支持者,把歐美所有左傾的政治主張與團體全打成共產主義,或認為左派政治正確文化等於文革,在現在的網路輿論中,對於左與右原先的概念及定義已經造成混淆。因此這篇文希望從政治哲學的基本概念,簡單介紹左派與右派的光譜,與它們在動態歷史過程中演變。
Thumbnail
他總是莫名的堅持,烤土司一定要左右對稱從中間切開。 接著抹上奶油和果醬,然後優雅地拿起來吃。
Thumbnail
事實上,台灣的兩大政黨,國民黨是國家社會主義式的,民進黨是社會民主主義式的,而其他小政黨,尤其是以道德與良心做為號召的政黨都是極左的。所以台灣沒有左翼政黨是因為他們希望的共產主義烏托邦式政黨本來就不能存在了,他們才會說搞政治的都右翼。
左右左右 慢跑秀髮 左右左右 人生選擇 左右左右 飲者步伐 左右左右 落葉飄零 左右左右 愛與被愛 左右左右 日出日落