原题内容:
给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:
()得 1 分。AB得A + B分,其中 A 和 B 是平衡括号字符串。(A)得2 * A分,其中 A 是平衡括号字符串。
示例 1:
1 | 输入: "()" |
1 |
|
输入: “(())”
输出: 2
1
2
**示例 3:**
输入: “()()”
输出: 21
2
示例 4:1
2输入: "(()(()))"
输出: 6
提示:
S是平衡括号字符串,且只含有(和)。2 <= S.length <= 50
模板:
1 | class Solution: |
思路:
我的第一想法是利用 Json ,把所传入的字符串 S 里的所有 () 替换为 [],然后在字符串合适的位置加上逗号,以此将字符串转化为 json 能识别的字符串,再转化为 Python list 对象,最后用一个递归函数求得这个 list 的“分数”。
设计:
考虑所有情况。
如果要把字符串 "(()(()))" 转化为 json 认识的字符串,那应该是 [[ ], [[ ]]] 。但是要注意,json 不认识 [],[] 这样的字符串(里面有两个 list ),于是我们干脆把所有传进来的原字符串外面套一个 [] 。省得去分情况判断,这样的话因为外面加一个括号会使得得到的值 乘以2 所以我们在最后返回值的时候应该将结果 除以2 。
我们能发现逗号出现的地方一定是原字符串反括号接正括号的地方——
)(->],[,这是第一项替换。所有的小括号替换成中括号,这是第二项替换。
- 把上一步得到的字符串用
[ ]框起来,这是第三项替换。
我们来实现这部分代码:
1 | class Solution: |
通过这三步就把 S 转化成了一个服服帖帖的 list 对象而不再是 str 对象。接下来我们考虑计算“分数”的部分。
直接上代码了,很简洁:
1 | # 注意缩进,保持在scoreOfParentheses函数之内 |
最后 return 调用cal() 函数,并将得到的值除以2就行了,因为我们在字符串外面多套了一个 []。
完整代码:
1 | class Solution: |