统计同构子字符串的数目问题(进阶版)
字数 866 2025-11-12 11:12:33

统计同构子字符串的数目问题(进阶版)

题目描述:
给定一个字符串s,统计其中同构子字符串的数目。同构子字符串定义为:该子字符串中所有字符都相同。例如,字符串"aaa"包含6个同构子字符串:"a"(3个)、"aa"(2个)、"aaa"(1个)。

解题过程:

  1. 问题分析
    我们需要统计字符串中所有字符都相同的连续子串的个数。比如:
  • "a":只有1个同构子串"a"
  • "aa":有3个同构子串("a"、"a"、"aa")
  • "aaa":有6个同构子串(3个"a"、2个"aa"、1个"aaa")
  1. 基础解法思路
    我们可以遍历字符串,找到所有连续的相同字符段。对于长度为n的连续相同字符段,它包含的同构子串数量为:1 + 2 + 3 + ... + n = n(n+1)/2

  2. 动态规划定义
    定义dp[i]表示以第i个字符结尾的最长同构子串长度。

  3. 状态转移方程

  • 如果s[i] == s[i-1],那么dp[i] = dp[i-1] + 1
  • 如果s[i] != s[i-1],那么dp[i] = 1
  1. 计算总数目
    对于每个位置i,dp[i]表示以i结尾的同构子串个数。总数目就是所有dp[i]的和。

  2. 具体步骤示例
    以字符串"aaabb"为例:

  • i=0: dp[0] = 1,总数目=1
  • i=1: s[1]=='a'==s[0],dp[1]=dp[0]+1=2,总数目=1+2=3
  • i=2: s[2]=='a'==s[1],dp[2]=dp[1]+1=3,总数目=3+3=6
  • i=3: s[3]=='b'≠s[2],dp[3]=1,总数目=6+1=7
  • i=4: s[4]=='b'==s[3],dp[4]=dp[3]+1=2,总数目=7+2=9

验证:字符串"aaabb"的同构子串确实有9个。

  1. 算法实现
def count_homogenous_substrings(s):
    if not s:
        return 0
    
    n = len(s)
    dp = [0] * n
    dp[0] = 1
    total = 1
    
    for i in range(1, n):
        if s[i] == s[i-1]:
            dp[i] = dp[i-1] + 1
        else:
            dp[i] = 1
        total += dp[i]
    
    return total
  1. 复杂度分析
  • 时间复杂度:O(n),只需要遍历一次字符串
  • 空间复杂度:O(n),可以优化到O(1)只使用变量记录前一个状态

这种方法通过动态规划高效地统计了所有同构子字符串的数目。

统计同构子字符串的数目问题(进阶版) 题目描述: 给定一个字符串s,统计其中同构子字符串的数目。同构子字符串定义为:该子字符串中所有字符都相同。例如,字符串"aaa"包含6个同构子字符串:"a"(3个)、"aa"(2个)、"aaa"(1个)。 解题过程: 问题分析 我们需要统计字符串中所有字符都相同的连续子串的个数。比如: "a":只有1个同构子串"a" "aa":有3个同构子串("a"、"a"、"aa") "aaa":有6个同构子串(3个"a"、2个"aa"、1个"aaa") 基础解法思路 我们可以遍历字符串,找到所有连续的相同字符段。对于长度为n的连续相同字符段,它包含的同构子串数量为:1 + 2 + 3 + ... + n = n(n+1)/2 动态规划定义 定义dp[ i ]表示以第i个字符结尾的最长同构子串长度。 状态转移方程 如果s[ i] == s[ i-1],那么dp[ i] = dp[ i-1 ] + 1 如果s[ i] != s[ i-1],那么dp[ i ] = 1 计算总数目 对于每个位置i,dp[ i]表示以i结尾的同构子串个数。总数目就是所有dp[ i ]的和。 具体步骤示例 以字符串"aaabb"为例: i=0: dp[ 0 ] = 1,总数目=1 i=1: s[ 1]=='a'==s[ 0],dp[ 1]=dp[ 0 ]+1=2,总数目=1+2=3 i=2: s[ 2]=='a'==s[ 1],dp[ 2]=dp[ 1 ]+1=3,总数目=3+3=6 i=3: s[ 3]=='b'≠s[ 2],dp[ 3 ]=1,总数目=6+1=7 i=4: s[ 4]=='b'==s[ 3],dp[ 4]=dp[ 3 ]+1=2,总数目=7+2=9 验证:字符串"aaabb"的同构子串确实有9个。 算法实现 复杂度分析 时间复杂度:O(n),只需要遍历一次字符串 空间复杂度:O(n),可以优化到O(1)只使用变量记录前一个状态 这种方法通过动态规划高效地统计了所有同构子字符串的数目。