LeetCode 🔴 1542. Find Longest Awesome Substring
🔗 🔴 1542. Find Longest Awesome Substring 2222
tags: Biweekly Contest 32
前綴和(Prefix Sum)
前綴異或和
位運算(Bit Manipulation)
狀態壓縮
雜湊表(Hash Table)
題意
給定一個字串 ,一個 超棒子字串(awesome substring) 是 的 非空 子字串,使得我們可以進行任意次數的交換來使其成為一個 回文 字符串。
返回 中最長超棒子字串的長度。
思路:前綴異或和 + 狀態壓縮 + 雜湊表(Hash Table)
由於可以重新排列,因此我們只要關心子字串的長度是否為奇數,以及每個字元的出現次數的奇偶性即可。
- 若子字串長度為偶數,則所有字元的出現次數都應為偶數。
- 若子字串長度為奇數,則除了一個字元的出現次數為奇數外,其他字元的出現次數都應為偶數。
由於字串中的字元只包含了 個數字,因此我們可以用一個狀態 來表示每個字元的出現次數的奇偶性,其中 為 表示第 個字元出現奇數次, 表示出現偶數次。
從字串的第一個字元開始,我們可以計算每個位置的前綴異或和 ,若有兩個位置的前綴異或和相同,即 ,,則這兩個位置之間的子字串滿足條件。
- 對於情況 1,顯然每個狀態與先前出現過的相同狀態就構成了一個符合條件的子字串;
- 對於情況 2,若存在一個狀態與自己 XOR 後只有一個 1 的狀態,則兩者間的子字串就滿足條件,因此可以分別反轉當前狀態每一位,檢查是否存在這樣的狀態。
因此我們只需要一個雜湊表 來保存每個狀態「最早」出現的位置,當再次出現時計算兩者間的距離即可。
- 由於空字串的狀態為所有字元出現次數都為偶數,即 ,位置可以視為 ,因此初始化 。
複雜度分析
- 時間複雜度 ,其中 為字串長度, 為字元集大小,本題中 。
- 空間複雜度 。
1 | class Solution: |
1 | class Solution { |
類題:前綴異或和
- 🟡 1310. XOR Queries of a Subarray 1460
- 🟡 1177. Can Make Palindrome from Substring 1848
- 🟡 1371. Find the Longest Substring Containing Vowels in Even Counts 2041
- 🔴 1542. Find Longest Awesome Substring 2222
- 🟡 1915. Number of Wonderful Substrings 2235
- 🔴 2791. Count Paths That Can Form a Palindrome in a Tree 2677
題單來自:@灵茶山艾府
寫在最後
Cover photo is generated by @たろたろ, thanks for their work!
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 十六個天亮!
評論
WalineGiscus