1371. 每个元音包含偶数次的最长子字符串

给你一个字符串 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={'a':0,'e':0,'i':0,'o':0,'u':0}
            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={'a':0,'e':0,'i':0,'o':0,'u':0}
        for i in range(len(s)):
            if s[i] in tmp_count:tmp_count[s[i]]+=1
            p.append(list(tmp_count.values()))
        
        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

 

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 创作都市 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读