一、前言
一听到括号两个字,第一反应估计都是用栈,找到最外层的括号删掉就好了。那问题来了,如何判断是最外层的括号?
- 压栈前栈为空,此时的左括号即为最外层
- 压栈后栈为空,此时的右括号即为最外层 我们也可以反方向思考,找到不是最外层的括号拼接。这道题,我将不用栈数据结构解,但是本质上还是栈的思想来解。
- 压栈可以看成+1,出栈可以代表-1
二、题目描述
原谅我比较懒,我直接从leetcode截图,来看咱们的题目描述了哈,欲知更加清楚的描述,请看leetcode题目链接
三、分析
核心思想:
- 遇见左括号cnt+1, 若cnt>1时,说明此左括号不是最外层括号,故将其拼接到ret上
- 遇见右括号cnt-1, 若cnt>0时,说明此右括号不是最外层括号,故将其拼接到ret上
具体步骤:
- cnt计数, cnt初始为0
- ret保存 删除最外层括号后的结果, 初始化为''
- 遍历传入字符串
- 遇见左括号cnt+1, 若cnt>1时,说明此左括号不是最外层括号,故将其拼接到ret上
- 遇见右括号cnt-1, 若cnt>0时,说明此右括号不是最外层括号,故将其拼接到ret上
- 返回ret
四、代码
/**
* @param {string} s
* @return {string}
*/
const removeOuterParentheses = function(s) {
// cnt计数, cnt初始为0
let cnt = 0
// ret保存 删除最外层括号后的结果, 初始化为''
let ret = ''
// 遍历传入字符串
for(const val of s) {
if(val === '(' ) {
// 遇见左括号cnt+1
cnt++
// 若cnt>1时,说明此左括号不是最外层括号,故将其拼接到ret上
cnt > 1 && (ret += val)
} else {
// 遇见右括号cnt-1
cnt--
// 若cnt>0时,说明此右括号不是最外层括号,故将其拼接到ret上
cnt > 0 && (ret += val)
}
}
// 返回ret
return ret
};