【Leetcode】1371. 每个元音包含偶数次的最长子字符串(Python)

class Solution(object):
    def findTheLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        D = {"a": 1, "e": 2, "i": 4, "o": 8, "u": 16}
        L = {0: 0}
        m = t = 0
        for i, c in enumerate(s, 1):
            t ^= D.get(c, 0)
            m = max(m, i - L.setdefault(t, i))
        return m
class Solution:
    def findTheLongestSubstring(self, s: str) -> int:
        D = {"a": 1, "e": 2, "i": 4, "o": 8, "u": 16}
                     # a 00001
                     # e 00010
                     # i 00100
                     # o 01000
                     # u 10000

        L = {0: 0}
        m = 0
        t = 0

        for i, c in enumerate(s, 1): # idx 从1 开始
            t ^= D.get(c, 0) # 找 当前 char c,找到了 return  value,找不到return 0
                            # ^ 就是直接在 bitmap  上做异或运算
                            # 跟 0 做 异或 原值保持不变, 
                        
                            # 所以 t有 32种 情况,即 00000,00001,00010,00011 ...
                            # ***************************
                            # 要找的就是两次相同的 t ,即t2-t1 ,看32种 t2-t1 哪个最大 !!! 
                            # ***************************      
        #    print("D.get(c, 0)",D.get(c, 0))
        #    print("c=",c,"t=",t, "t=",bin(t))
            
            # print("t=",bin(t),"  i=",i,"  L=",L,"L.setdefault(t, i)",L.setdefault(t, i))

            m = max(m, i - L.setdefault(t, i)) # 函数和 get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值

            # 例如,t的值变化为 31-->30-->28-->29-->31
            # 对应的二进制位[11111]-->[11110]-->[11100]-->[11101]-->[11111]
            # 一个合理的字符串变化: ‘aeiou’ --> 'aeioua'-->'aeiouae'-->'aeiouaea'-->'aeiouaeae'
            # 由此可见,从'aeiou'到'aeiouaeae'这个过程中,多余出来的‘aeae’为符合条件的字符串

            #  再举例  假设 s=abcdeae dict(00000:0)
            #         i = 1,c=a,t=00001 ,   新增dict(00001:1) 
            #         i = 2,c=b,t=00001 ,  m* = i - dict(00001)
            #         i = 3,c=c,t=00001 ,  m* = i - dict(00001)
            #         i = 4,c=d,t=00001 ,  m* = i - dict(00001)
            #         i = 5,c=e,t=00011 , 新增dict(00011:5)  m* = i - dict(00011)
            #         i = 6,c=a,t=00010 , 新增dict(00010:6) m* = i - dict(00010)
            #         i = 7,c=e,t=00000 ,  m* = i - dict(00000) 

        return m
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值