这个题解的核心思路是使用位掩码来表示字符串s中每个位置上数字字符出现的奇偶性。首先,为每个数字0到9分配一个唯一的二进制位,使用异或操作来更新当前的位掩码。这个位掩码代表了从字符串开始到当前位置的所有字符的奇偶状态。如果两个位置的位掩码相同,或者位掩码相差一个二进制位(即只有一个数字的奇偶性不同),那么这两个位置之间的子字符串是一个超赞子字符串。该方法使用哈希表记录每个位掩码第一次出现的位置,以及该掩码所能达到的最大长度。通过遍历每个可能的掩码,并检查与当前掩码异或后只改变一个位的掩码是否存在,来找到可能的最长超赞子字符串。
时间复杂度: O(n)
空间复杂度: O(n)
class Solution:
def longestAwesome(self, s: str) -> int:
wei = {str(x):2**x for x in range(10)} # 为每个数字分配一个二进制位
r = [0] + list(wei.values()) # 可能的位掩码变化
a = {0:-1} # 记录位掩码第一次出现的位置
b = defaultdict(int) # 记录位掩码的最大长度
res = 0 # 当前位掩码
ss = [wei[x] for x in s] # 预处理字符串中每个字符对应的位掩码
for i,x in enumerate(ss):
res = res ^ x # 更新当前位掩码
if res in a:
b[res] = max(b[res],i) # 更新当前位掩码的最大长度
else:
a[res] = i # 记录位掩码首次出现的位置
b[res] = i
return max(b[x ^ j] - a[x] for x in a for j in r) # 检查每个位掩码和可能的单位改变,找到最长的超赞子字符串长度