本文主要是介绍前缀和+哈希表,LeetCode 1915. 最美子字符串的数目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、题目
1、题目描述
如果某个字符串中 至多一个 字母出现 奇数 次,则称其为 最美 字符串。
- 例如,
"ccjjc"
和"abab"
都是最美字符串,但"ab"
不是。给你一个字符串
word
,该字符串由前十个小写英文字母组成('a'
到'j'
)。请你返回word
中 最美非空子字符串 的数目。如果同样的子字符串在word
中出现多次,那么应当对 每次出现 分别计数。子字符串 是字符串中的一个连续字符序列。
2、接口描述
python3
class Solution:def wonderfulSubstrings(self, word: str) -> int:n = len(word)cnt = Counter()cnt[0] = 1res = s = 0for 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] += 1return 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
class Solution:def wonderfulSubstrings(self, word: str) -> int:n = len(word)cnt = Counter()cnt[0] = 1res = s = 0for 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] += 1return res
这篇关于前缀和+哈希表,LeetCode 1915. 最美子字符串的数目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!