前缀和+哈希表,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个二进制位表示当前前缀每个字符出现的奇偶性

那么si, j 合法,一定满足acci - 1 ^ accj 最多只有一个二进制位为1

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

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

全为偶数:那么区间异或和为0,贡献就是cnts

只有一个1:那么枚举是1的位,贡献就是cnts \^ (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
复制代码
 ​
相关推荐
想吃火锅10052 小时前
【leetcode】200. 岛屿数量
算法·leetcode·职场和发展
hold?fish:palm2 小时前
24 回文链表
数据结构·c++·链表
Nil2083 小时前
leetcode 54螺旋矩阵
算法·leetcode·矩阵
qeen876 小时前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
冻柠檬飞冰走茶7 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
evans在进步8 小时前
LeetCode 394:字符串解码——Java 单栈模拟与嵌套解析详解
java·python·leetcode
Nil2088 小时前
leetcode 189轮转数组
数据结构·算法·leetcode
吃着火锅x唱着歌9 小时前
LeetCode 3885.设计事件管理器
算法·leetcode·职场和发展
土司大王9 小时前
LeetCode hto100——字母异位词分组
java·算法·leetcode
依然鸣10 小时前
PTA团体程序设计天梯赛L1真题讲解L1-085-088
数据结构·c++·经验分享·算法·深度优先·pat考试