前缀和+哈希表,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
复制代码
 ​
相关推荐
来一碗刘肉面1 小时前
栈的应用(表达式求值)
数据结构·算法
程序猿乐锅3 小时前
【数据结构与算法 | 第六篇】力扣1109,1094差分数组
java·算法·leetcode
yuannl104 小时前
图的深度优先遍历DFS
数据结构
hold?fish:palm7 小时前
9 找到字符串中所有字母异位词
c++·算法·leetcode
Sw1zzle7 小时前
算法入门(六):贪心算法 - 基础入门(Leetcode 121/455/860/376/738)
算法·leetcode·贪心算法
青山木7 小时前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先
不会就选b8 小时前
算法日常・每日刷题--<归并排序>1
数据结构·算法
危桥带雨8 小时前
排序算法(快排、归并、计数、基数排序)
数据结构·算法·排序算法
啦啦啦啦啦zzzz8 小时前
算法:回溯算法
c++·算法·leetcode
zephyr058 小时前
数据结构-并查集
数据结构