地里新农-请到考试中心学习规则
- 积分
- 1
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2022-1-18
- 最后登录
- 1970-1-1
|
这个题目跟做题网二十有点像,但是string可以rearrange, 所以只需要记录各种字符的数量就可以了。
用这种方法可以在O(n)时间算出来从左到右,当前位置为止,是不是balanced。然后从右到左再算一次,最后合并一下。
代码没有优化,也没有足够的测试样例,不知道对不对,欢迎讨论- def balancedCount(s: str) -> int:
- inbalances = [0] * 2
- questions = 0
- lbalance = [False] * len(s)
- values = dict()
- values['['] = 1
- values[']'] = -1
- values['('] = 1
- values[')'] = -1
- for i in range(len(s)):
- c = s[i]
- if c in '[]':
- inbalances[0] += values[c]
- elif c in '()':
- inbalances[1] -= values[c]
- else:
- questions += 1
- lbalance[i] = True if abs(inbalances[0]) + abs(inbalances[1]) - questions == 0 else False
- questions = 0
- inbalances = [0] * 2
- rbalance = [False] * len(s)
- for i in range(len(s) - 1, -1, -1):
- c = s[i]
- if c in '[]':
- inbalances[0] += values[c]
- elif c in '()':
- inbalances[1] -= values[c]
- else:
- questions += 1
- rbalance[i] = True if abs(inbalances[0]) + abs(inbalances[1]) - questions == 0 else False
- ans = 0
- for i in range(len(s) - 1):
- if lbalance[i] and rbalance[i + 1]:
- ans += 1
- return ans
复制代码 |
|