📌  相关文章
📜  A 1s、B 10s 和 C 0s字符串中每个 1 的“10”子序列的总和计数(1)

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

题目介绍

本题要求计算给定字符串中每个 1 的“10”子序列总和的计数。例如,在字符串 A = "1101" 中,有两个子序列 "10""10",因此总和为 2

思路

我们可以使用双指针的方法进行遍历。定义两个指针 ij,初始值都从字符串的第一个字符开始。当我们在遍历过程中,发现 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$ 是字符串的长度。