1371 每個母音包含偶數次的最長子字串

2021-10-23 07:16:41 字數 2046 閱讀 4357

給你乙個字串 s ,請你返回滿足以下條件的最長子字串的長度:每個母音字母,即 'a','e','i','o','u' ,在子字串中都恰好出現了偶數次。

示例 1:

輸入:s = "eleetminicoworoep"

輸出:13

解釋:最長子字串是 "leetminicowor" ,它包含 e,i,o 各 2 個,以及 0 個 a,u 。

1.直接暴力,o(n³)

2.用字首和優化的暴力,o(n²),本質是空間換時間的做法

3.hash+狀態壓縮

1.用0/1表示每個字母的狀態(奇偶性),不需要是知道完成的出現次數

2.當乙個字母出現的時候用異或運算來更新,比如 aba,如開始時status=00000,然後到 a 的時候 00000 ^ 00001 = 00001,1 說明 a 出現奇數次

3.怎麼判斷某個區間內出現的字母是符合要求的?假如下標i的狀態status為 00011,下標j的狀態status也是00011,那麼[i,j]區間的子串符合要求

因為一定是經過了偶數次的操作才又恢復到了原來的status

4.什麼時候該更新res,當前的status在前面出現過的話就更新

class solution:

def findthelongestsubstring(self, s: str) -> int:

res=0

def func(s):

d=for i in s:

if i in d:d[i]+=1

for k,v in d.items():

if v%2!=0:return 0

return len(s)

for i in range(len(s)):

for j in range(i,len(s)):

res=max(res,func(s[i:j+1]))

return res

class solution:

def findthelongestsubstring(self, s: str) -> int:

res=0

p=tmp_count=

for i in range(len(s)):

if s[i] in tmp_count:tmp_count[s[i]]+=1

for i in range(len(s)):

for j in range(i,len(s)):

if i==0:

if sum([1 for k in range(5) if (p[j][k])%2!=0])==0:

res=max(res,j-i+1)

elif i!=0 and sum([1 for k in range(5) if (p[j][k]-p[i-1][k])%2!=0])==0:

res=max(res,j-i+1)

return res

class solution:

def findthelongestsubstring(self, s: str) -> int:

ans, status, n = 0, 0, len(s)

pos = [-1] * 32

pos[0] = 0

for i in range(n):

if s[i] == 'a':

status ^= 1 << 0

elif s[i] == 'e':

status ^= 1 << 1

elif s[i] == 'i':

status ^= 1 << 2

elif s[i] == 'o':

status ^= 1 << 3

elif s[i] == 'u':

status ^= 1 << 4

if pos[status] != -1:

ans = max(ans, i + 1 - pos[status])

else:

pos[status] = i + 1

return ans

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 每個母音包含偶數次的最長子字串

給你乙個字串 s 請你返回滿足以下條件的最長子字串的長度 每個母音字母,即 a e i o u 在子字串中都恰好出現了偶數次。示例 1 輸入 s eleetminicoworoep 輸出 13 解釋 最長子字串是 leetminicowor 它包含 e,i,o 各 2 個,以及 0 個 a,u 示例...