B站视频的地址:LeetCode1915_最美子字符串的数目_前缀和_位运算
class Solution {
public long wonderfulSubstrings(String word) {
// hash[i] 表示前缀和出现的次数
int[] hash = new int[1024];
// 全量word字符串是一个【只有一个奇数字符】的最美字符串
hash[0] = 1;
char[] array = word.toCharArray();
int len = array.length;
long result = 0;
int pre = 0;
for (int i = 0; i < len; i++) {
pre ^= (1 << (array[i] - 'a'));
// 情况一:子字符串只有偶数个字符
// 当前缀和再次出现的时候,说明两次前缀和之间出现了子字符串为偶数个字符
result += hash[pre];
hash[pre]++;
// 情况二:子字符串只有一个奇数个字符
// 该前缀和 和 另一个前缀和 之间的子字符串只有一个奇数个字符
// 不知哪一个为奇数个字符(a-j均有可能,因此需要遍历)
for (int j = 0; j < 10; j++) {
result += hash[pre ^ (1 << j)];
}
}
return result;
}
}