统计同构子字符串的数目
难度:中等
给你一个字符串 s
,返回 s
中 同构子字符串 的数目。由于答案可能很大,只需返回对 10^9 + 7
取余 后的结果。
同构字符串 的定义为:如果一个字符串中的所有字符都相同,那么该字符串就是同构字符串。
子字符串 是字符串中的一个连续字符序列。
示例 1:
输入:s = "abbcccaa"
输出:13
解释:同构子字符串如下所列:
"a" 出现 3 次。
"aa" 出现 1 次。
"b" 出现 2 次。
"bb" 出现 1 次。
"c" 出现 3 次。
"cc" 出现 2 次。
"ccc" 出现 1 次。
3 + 1 + 2 + 1 + 3 + 2 + 1 = 13
示例 2:
输入:s = "xy"
输出:2
解释:同构子字符串是 "x" 和 "y" 。
示例 3:
输入:s = "zzzzz"
输出:15
数学
思路:
遍历字符串 s s s,用指针 l l l 指向当前字符,指针 r r r 指向下一个不同的字符,那么 [ r , . . l − 1 ] [r,..l-1] [r,..l−1] 区间内的字符都是相同的,假设 c n t = j − i cnt=j-i cnt=j−i,那么该区间内的同构子字符串个数为 ( 1 + c n t ) × c n t 2 \frac{(1 + cnt) \times cnt}{2} 2(1+cnt)×cnt,将其累加到答案中即可。继续遍历,直到指针 r r r 到达字符串末尾。
遍历完字符串 s s s 后,返回答案即可。注意答案的取模操作。
复杂度分析:
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n 字符串 s s s 的长度。
- 空间复杂度: O ( 1 ) O(1) O(1)。仅使用常量空间。
class Solution:
def countHomogenous(self, s: str) -> int:
l, r = 0, 0
length, res = len(s), 0
while r < length:
if s[l] != s[r]:
res += (r - l) * (r - l + 1) // 2
l = r
r += 1
res += (r - l) * (r - l + 1) // 2
return int(res) % (10**9 + 7)
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/count-number-of-homogenous-substrings