4006. 统计有效前缀数目
题目描述
给你一个 二进制 字符串 s。
如果 s 的某个 前缀 的字符可以重新排列成一个 交替 字符串,那么该前缀被认为是 有效 的。
返回 s 中有效前缀的数量。
二进制 字符串是仅由 '0' 和 '1' 组成的字符串。
字符串的 前缀 是指从字符串的开头开始并延伸到其内任意点的 子字符串。
子字符串 是字符串中连续且 非空 的字符序列。
如果一个字符串中没有两个相邻字符相等,那么它被认为是 交替 的。
示例 1:
输入: s = "00101"
输出: 3
解释:
有效的前缀是:
"0":它已经是一个交替字符串。"001":可以被重新排列成"010",这是一个交替字符串。"00101":可以被重新排列成"01010",这是一个交替字符串。
因此,答案是 3。
示例 2:
输入: s = "101"
输出: 3
解释:
s = "101" 的所有前缀都已经是交替字符串。因此,答案是 3。
提示:
1 <= s.length <= 100s仅由'0'和'1'组成。
解法
方法一:计数
一个字符串能够重新排列成交替字符串,当且仅当其中 '0' 和 '1' 的数量之差不超过 \(1\)。
因此,我们遍历字符串 \(s\),用一个变量 \(t\) 维护当前前缀中 '1' 的个数减去 '0' 的个数(遇到 '1' 时加一,遇到 '0' 时减一)。如果 \(|t| \leq 1\),说明当前前缀是有效的,答案加一。
时间复杂度 \(O(n)\),其中 \(n\) 为字符串 \(s\) 的长度。空间复杂度 \(O(1)\)。
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 | |