Skip to content

20625: 1跟0数量相等的子字串

http://cs101.openjudge.cn/practice/20625/

给一个由0跟1组成的字串,请问有多少个子字串(非空)的0跟1数量相等而且0跟1分别是连续的 如果一个子字串出现n次记作n

输入

一个1跟0组成的字串

输出

一个整数

样例输入

10101

样例输出

4

提示

总个有4个子字串,10 01 10 01 1010不算,因为1跟0不是连续的

考虑到这个问题的特殊性(0和1必须是连续的),我们可以采取另一种方法,即只计算每段连续的0或1结束时的子串数量。我们不需要关心整个串的子串,只要关心局部的连续部分即可。

在遍历字符串时,需要统计当前连续相同字符的数量,并在遇到不同字符时,检查之前的连续字符部分可以组成多少合法子串。

解释代码逻辑:

  • 我们用 curr_count 来跟踪当前字符连续出现的次数,用 prev_count 来跟踪上一组字符连续出现的次数。
  • 每次字符发生变化时,我们可以创建 min(curr_count, prev_count) 个子字符串,因为新的字符将断开之前的连续性。
  • 然后我们更新 prev_countcurr_count(因为我们要开始统计新的字符了),并将 curr_count 重置为1。
  • 在字符串遍历结束后,我们还需要再加上最后一组字符可以形成的子字符串数。
python
def count_balanced_substrings(s):
    # 初始化当前字符和前一个字符的计数器
    curr_count = 1
    prev_count = 0
    result = 0

    # 遍历字符串的每个字符
    for i in range(1, len(s)):
        # 如果当前字符和前一个字符相同,增加当前计数器
        if s[i] == s[i - 1]:
            curr_count += 1
        else:
            # 如果当前字符和前一个字符不同,那么我们可以创建
            # min(curr_count, prev_count) 个子串
            result += min(curr_count, prev_count)
            # 将当前计数器值赋给前一个计数器,并重置当前计数器为1
            prev_count = curr_count
            curr_count = 1

    # 出循环后,处理最后一组字符
    result += min(curr_count, prev_count)

    return result

# 测试样例输入
#print(count_balanced_substrings("10101"))  # 输出应该是4
#print(count_balanced_substrings("00110011"))  # 输出应该是6
print(count_balanced_substrings(input()))