class Solution {
public int longestAwesome(String s) {
// 记录结果,即下标差
int res = 0;
// 记录截止遍历位每一种 bit mask 出现的最小下标 数组大小为 2^10
int seen[] = new int[1024];
// 初始位置 bit mask 为 0,即空串
int mask = 0;
int n = s.length();
// 初始化下标值
Arrays.fill(seen, n);
// 表示空串对应 bit mask 出现的最小下标为 -1
seen[0] = -1;
// 从头到尾循环遍历字符串
for (int i = 0; i < n; i++) {
// 翻转当前字符对应 bit 位,得到当前字符串前缀 bit mask
mask ^= 1 << (s.charAt(i) - '0');
// 对应全为偶数的下标差
res = Math.max(res, i - seen[mask]);
// 0 到 9 按顺序依次翻转bit位,对应仅有一个奇数的 bit mask
for (int j = 0; j < 10; j++) {
res = Math.max(res, i - seen[mask ^ (1 << j)]);
}
// 更新 bit mask 对应的最小下标
seen[mask] = Math.min(seen[mask], i);
}
return res;
}
}