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