📌  相关文章
📜  给定二进制字符串中所有字符相同的子字符串的计数(1)

📅  最后修改于: 2023-12-03 14:56:53.258000             🧑  作者: Mango

给定二进制字符串中所有字符相同的子字符串的计数

问题描述

给定一个二进制字符串,找到该字符串中所有字符相同的子字符串的个数。

例如,输入为 "0110001111",输出为 6。原因是该字符串中的所有字符相同的子字符串为 "0", "11", "000", "1111", "00", "111"。

解决方案
算法一

思路: 枚举所有的子串,对每个子串判断是否所有字符都相同。

伪代码:

count = 0
for i in range(n):
    for j in range(i, n):
        substr = s[i:j+1]
        if all(substr[k] == substr[0] for k in range(len(substr))):
            count += 1
return count

该算法的时间复杂度为 $O(n^3)$。

算法二

思路: 统计每个字符连续出现的次数,将连续出现次数 $k$ 的字符看作一个整体,那么包含该整体的子串就是一个符合条件的子串,可以通过组合公式 $C_k^2 + k$ 来计算该整体可以组成多少个符合条件的子串。

伪代码:

count = 0
i = 0
while i < n:
    j = i
    while j < n and s[j] == s[i]:
        j += 1
    k = j - i
    count += k * (k+1) // 2
    i = j
return count

该算法的时间复杂度为 $O(n)$。

总结

本题可以通过统计连续出现次数来优化时间复杂度,使得时间复杂度从 $O(n^3)$ 降到了 $O(n)$。