給你乙個字串 s ,請你返回滿足以下條件的最長子字串的長度:每個母音字母,即 『a』,『e』,『i』,『o』,『u』 ,在子字串中都恰好出現了偶數次。
示例 1:
輸入:s = 「eleetminicoworoep」
輸出:13
解釋:最長子字串是 「leetminicowor」 ,它包含 e,i,o 各 2 個,以及 0 個 a,u 。
示例 2:
輸入:s = 「leetcodeisgreat」
輸出:5
解釋:最長子字串是 「leetc」 ,其中包含 2 個 e 。
示例 3:
輸入:s = 「bcbcbc」
輸出:6
解釋:這個示例中,字串 「bcbcbc」 本身就是最長的,因為所有的母音 a,e,i,o,u 都出現了 0 次。
1 <= s.length <= 5 x 10^5
s 只包含小寫英文本母。
這題太妙了我這種木頭做的腦子只能想到滑動視窗暴力
轉乙個大佬思路
首先題目中要求子字串中每個母音字母恰好出現偶數次,我們就可以使用 0 和 1 來標識每個字母的狀態(偶數次或奇數次),我們不需要知道每個字母出現的完整次數,只需要知道這個次數的奇偶性
那麼我們可以注意到奇數次 + 1 = 偶數次,偶數次 + 1 = 奇數次,所以我們可以使用 異或 來參與運算: 比如 aba
初始時 status = 00000,然後到 a 的時候 00000 ^ 00001 = 00001,1 說明 a 出現奇數次
然後到 b 的時候 00001 ^ 00010 = 00011,兩個 1 說明 a、b 都出現奇數次
最後到 a 的時候 00011 ^ 00001 = 00010,說明只有 b 出現奇數次了。
以上也說明我們確實是可以使用狀態碼去標識每個母音字母出現次數的奇偶性。
那麼我們怎麼去統計最長子串的長度呢?
首先我們先盤盤哪些子串符合要求,因為現在每個下標對應的狀態碼其實也就只有 0 和 1
如果座標 i 對應的狀態碼是 00011,座標 j 對應的狀態碼是 00011,那麼他們倆中間的母音字母數一定是偶數,如果某一位不相同,那麼絕對不可能是偶數,因為偶數-奇數=奇數,奇數-偶數=奇數
所以我們每次求出乙個座標的狀態碼的時候就去瞅瞅這個狀態碼前面是否存在,如果存在,那麼就計算一下之間子字串的長度就 ok 了,那麼我們還需要啥?明顯需要乙個hash表,儲存每個狀態碼對應的下標!當然因為我們狀態碼最長也就是 11111 = 2^5 - 1 = 31,開乙個 32 大小的陣列就好了。
因為是學習官方題解寫的,**也差不多,這個**確實是比較簡潔清晰的,也沒必要去覆盤。
class
solution
if(book[cur]==-
1)book[cur]
= i +1;
else
res =
max(res, i +
1- book[cur]);
}return res;}}
;
1371 每個母音包含偶數次的最長子字串
給你乙個字串 s 請你返回滿足以下條件的最長子字串的長度 每個母音字母,即 a e i o u 在子字串中都恰好出現了偶數次。示例 1 輸入 s eleetminicoworoep 輸出 13 解釋 最長子字串是 leetminicowor 它包含 e,i,o 各 2 個,以及 0 個 a,u 示例...
1371 每個母音包含偶數次的最長子字串
給你乙個字串 s 請你返回滿足以下條件的最長子字串的長度 每個母音字母,即 a e i o u 在子字串中都恰好出現了偶數次。示例 1 輸入 s eleetminicoworoep 輸出 13 解釋 最長子字串是 leetminicowor 它包含 e,i,o 各 2 個,以及 0 個 a,u 示例...
1371 每個母音包含偶數次的最長子字串
難度 中等 2020 5 20每日一題打卡 字首和 狀態壓縮 雜湊表 今天2020520,算是乙個很特別的日子了!但是每日一題還是要寫的 抄題解的一天 類似的題 1124.表現良好的最長時間段 題目描述 解題思路 參考題解 每個母音包含偶數次的最長子字串 官方題解 將題目一步步等價轉化 非奇即偶 與...