505 字
3 分钟
1759. 统计同质子字符串的数目

1759. 统计同质子字符串的数目#

题目描述#

给你一个字符串 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

提示:

  • 1 <= s.length <= 10^5

解题思路#

核心思想#

与 1513 题完全同构。把字符串按连续相同字符分成段,对每段长度 k,其内部可形成的同质子串数量为 k*(k+1)/2,全部相加并对 10^9+7 取模。

段贡献示意(s = “abbcccaa”):

a | bb | ccc | aa
1 3 6 3 → 总计 13

算法步骤#

  1. 初始化 ans = 0,i = 0。
  2. 当 i < n 时:
    • j = i,扩展 while j+1 < n and s[j+1] == s[i];
    • 段长 k = j - i + 1,ans += k*(k+1)//2,i = j + 1。
  3. 返回 ans % (10^9+7)。

逐步举例#

以 s = "abbcccaa" 为例:

段区间长度 k贡献 k(k+1)/2
a[0,0]11
bb[1,2]23
ccc[3,5]36
aa[6,7]23

合计 1 + 3 + 6 + 3 = 13。

复杂度分析#

  • 时间复杂度:O(N),单次线性扫描。
  • 空间复杂度:O(1)。

代码实现#

{{% highlight python %}}

class Solution:
def countHomogenous(self, s: str) -> int:
MOD = 10 ** 9 + 7
ans = 0
n = len(s)
i = 0
while i < n:
j = i
while j + 1 < n and s[j + 1] == s[i]:
j += 1
k = j - i + 1
ans = (ans + k * (k + 1) // 2) % MOD
i = j + 1
return ans
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent))
import unittest
from solution import Solution
class TestSolution(unittest.TestCase):
def test_example1(self):
self.assertEqual(Solution().countHomogenous("abbcccaa"), 13)
def test_example2(self):
self.assertEqual(Solution().countHomogenous("xy"), 2)
if __name__ == '__main__':
unittest.main()

{{% /highlight %}}

1759. 统计同质子字符串的数目
https://h1s97x.github.io/posts/coding/coding-1759-count-number-of-homogenous-substrings/
作者
H1S97X
发布于
2026-08-23
许可协议
CC BY-NC-SA 4.0
随机文章