前缀和+哈希表,LeetCode 1915. 最美子字符串的数目

一、题目

1、题目描述

如果某个字符串中 至多一个 字母出现 奇数 次,则称其为 最美 字符串。

  • 例如,"ccjjc""abab" 都是最美字符串,但 "ab" 不是。

给你一个字符串 word ,该字符串由前十个小写英文字母组成('a''j')。请你返回 word最美非空子字符串 的数目*。* 如果同样的子字符串在word 中出现多次,那么应当对 每次出现 分别计数*。*

子字符串 是字符串中的一个连续字符序列。

2、接口描述

python3
复制代码
 ​
python 复制代码
class Solution:
    def wonderfulSubstrings(self, word: str) -> int:
        n = len(word)

        cnt = Counter()
        cnt[0] = 1
        res = s = 0
                
        for i, x in enumerate(word):
            s ^= 1 << (ord(x) - ord('a'))
            res += cnt[s] # 全偶
            res += sum(cnt[s ^ (1 << y)] for y in range(10))
            cnt[s] += 1

        return res

3、原题链接

1915. Number of Wonderful Substrings


二、解题报告

1、思路分析

考虑用10个二进制位表示当前前缀每个字符出现的奇偶性

那么s[i, j] 合法,一定满足acc[i - 1] ^ acc[j] 最多只有一个二进制位为1

我们用哈希表记录每个前缀异或和出现次数,边维护前缀异或和边计数即可

计数来自两部分:(记当前前缀异或和为s)

全为偶数:那么区间异或和为0,贡献就是cnt[s]

只有一个1:那么枚举是1的位,贡献就是cnt[s ^ (1 << j)]

2、复杂度

时间复杂度: O(N)空间复杂度:O(N)

3、代码详解

python3
python 复制代码
class Solution:
    def wonderfulSubstrings(self, word: str) -> int:
        n = len(word)

        cnt = Counter()
        cnt[0] = 1
        res = s = 0
                
        for i, x in enumerate(word):
            s ^= 1 << (ord(x) - ord('a'))
            res += cnt[s] # 全偶
            res += sum(cnt[s ^ (1 << y)] for y in range(10))
            cnt[s] += 1

        return res
复制代码
 ​
相关推荐
努力写代码的熊大25 分钟前
链式二叉树数据结构(递归)
数据结构
yi.Ist26 分钟前
数据结构 —— 键值对 map
数据结构·算法
爱学习的小邓同学26 分钟前
数据结构 --- 队列
c语言·数据结构
s1533529 分钟前
数据结构-顺序表-猜数字
数据结构·算法·leetcode
闻缺陷则喜何志丹30 分钟前
【前缀和 BFS 并集查找】P3127 [USACO15OPEN] Trapped in the Haybales G|省选-
数据结构·c++·前缀和·宽度优先·洛谷·并集查找
Coding小公仔31 分钟前
LeetCode 8. 字符串转换整数 (atoi)
算法·leetcode·职场和发展
GEEK零零七37 分钟前
Leetcode 393. UTF-8 编码验证
算法·leetcode·职场和发展·二进制运算
lifallen7 小时前
Paimon LSM Tree Compaction 策略
java·大数据·数据结构·数据库·算法·lsm-tree
秋说12 小时前
【PTA数据结构 | C语言版】线性表循环右移
c语言·数据结构·算法
JiaJZhong14 小时前
力扣.最长回文子串(c++)
java·c++·leetcode