平衡括号串:操作数和右括号需求数的维护过程

题目

如果知识判断合法括号,以及一个左括号对应一个右括号的最少插入次数,都是比较简单的。本题的难点在于:任何左括号"(“必须对应两个连续的右括号”)"

在这里插入图片描述

题解

先写出题目的代码框架:

def minInsertions(s: str) -> int:
	res = 0  # 记录操作数
	needs = 0 # 记录对右括号的需求数
	for i in s:
		if i == '(':
			needs += 2
		elif i == ')':
			needs -= 1
	
	return res + needs

现在考虑什么时候需要插入操作呢?

  1. 先看遇到右括号的时候(这个比较简单),如果needs为负数了,说明右括号太多了,需要补一个左括号啦!
if needs == -1:
	# 补左括号,操作数+1
	res += 1
	# 补了一个左括号,右括号需求加2
	needs += 2
  1. 再看遇到左括号的时候,这里比较难想到:如果needs为奇数了,需要补一个右括号
if needs % 2 == 1:
	# 补右括号
	res += 1
	needs -= 1
  • 为啥needs会为奇数呢,上面1的操作就会带来needs=1的情况,因为我们加了一个左括号,当时右括号又只有1个,所以加完后needs就等于1了。这个时候再遇到左括号,needs也只会2个2个的加,怎么加都是个奇数。
  • needs为奇数的时候,我不补一个右括号不行吗?不加的时候可以通过54/102个测试案例,但是下面这个就会报错了:

s = “(()))(()))()())))”
输出1,期望输出4。

我们看一下到底是哪里出了问题,我们列出前5次迭代的res和needs的值,可以看到iter=4的时候出现了needs为奇数的情况,也就是(())),此时我们没有进行处理,当iter=5出现左括号的时候,就直接在needs继续减了。但明显我们应该先补一个右括号才是合法的。

iterresneeds
002
104
203
302
401
503

完整代码

def minInsertions(s: str) -> int:
	res = 0  # 记录操作数
	needs = 0 # 记录对右括号的需求数
	for i in s:
		if i == '(':
			needs += 2
			if needs % 2 == 1:
				# 补右括号一个
				res += 1
				needs -= 1
		elif i == ')':
			needs -= 1
			if needs == -1:
				# 补左括号,操作数+1, needs + 2
				res += 1
				needs += 2
	
	return res + needs
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值