LC1915-最美子字符串的数目
1915. 最美子字符串的数目
解析:为了解决题目的问题,我们需要知道某一区间某个字符出现的次数,这里利用前缀和解决。
s[i][j]
表示前i个字符中,字符j + 'a'
出现的次数。
对于s[i]
的10个分量,如果是偶数用0表示,如果是奇数则用1表示,最后压成一个二进制数 state。
对于题中所要求的问题,即对于某个state,找到其他相同state的数目+只与其有一位不同的state的数目和。
using ll = long long;
const int N = 1e5 + 10;
int cnt[(2 << 10) + 10];
int s[N][10];//前i个字符中某个字符出现的次数
class Solution {
public:
long long wonderfulSubstrings(string word) {
ll n = word.size(),ans = 0;
memset(cnt,0,sizeof cnt);
cnt[0]++;
for(int i = 1; i <= n; ++i){
for(int j = 0; j < 10; ++j)
if('a' + j == word[i - 1])s[i][j] = s[i - 1][j] + 1;
else s[i][j] = s[i - 1][j];
int state = 0;
for(int j = 0; j < 10; ++j)state = (state << 1) + s[i][j] % 2;
for(int j = 0; j < 10; ++j)ans += cnt[state ^ (1 << j)];
ans += cnt[state] ++;
}
return ans;
}
};