📅  最后修改于: 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)$。