📅  最后修改于: 2023-12-03 14:38:59.853000             🧑  作者: Mango
本题要求计算给定字符串中每个 1
的“10”子序列总和的计数。例如,在字符串 A = "1101"
中,有两个子序列 "10"
和 "10"
,因此总和为 2
。
我们可以使用双指针的方法进行遍历。定义两个指针 i
和 j
,初始值都从字符串的第一个字符开始。当我们在遍历过程中,发现 s[j] == '1'
时,我们可以说明当前位置可以与之前的位置 i
组成一个“10”子序列,即 (i, j)
这个区间是一个合法的“10”子序列。同时,我们需要将当前位置 j
的值加到答案中,用于统计以当前位置为结尾的“10”子序列的个数。最后,我们需要将指针 i
更新为 j+1
,以便继续遍历区间 (i+1, n)
。
def count_subsequences(s: str) -> int:
n = len(s)
i, j = 0, 0
cnt = 0 # 用于统计 “10” 子序列的个数
for j in range(n):
if s[j] == '1':
cnt += j - i
i = j + 1
# 统计最后一个子序列
cnt += j - i + 1
return cnt
该函数的时间复杂度为 $O(n)$,其中 $n$ 是字符串的长度。