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_count为curr_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()))