括号有效配对一箭三连(一)

136 阅读1分钟

一、题目描述:

1) 任何一个左括号都能找到和其正确配对的右括号
2) 任何一个右括号都能找到和其正确配对的左括号
问题一: 怎么判断一个括号字符串有效
问题二:括号最多嵌套几层

示例:

问题一示例

输入:(()) 输出:true
输入:()() 输出:true
输入:(()()) 输出:true
输入:(() 输出:false
输入:)( 输出:false

问题二示例

输入:(()) 输出:2
输入:(()()) 输出:2
输入:(()(())) 输出:3

二、思路分析:

问题一:

使用一个变量count,记录'('的个数,当遇到')'时,执行减一操作。最后判断count是否为0,等于0表示括号字符串正好配对,否则不匹配。

问题二:

括号最多嵌套几层可以沿用问题一的方法,使用变量记录'('的个数,遇到')'时,执行减一操作。使用max记录count最大值,返回max即可。

三、AC 代码:

// 问题一
function isVlid(s) {
  let count = 0
  for (let i = 0; i < s.length; i++) {
    s[i] === '(' ? count++ : count--
  }
  return count === 0;
}
// 问题二
function deep(s) {
  let count = 0
  let max = 0
  for (let i = 0; i < s.length; i++) {
    s[i] === '(' ? count++ : count--
    max = Math.max(max, count)
  }
  return max
}

四、总结:

对于括号的配对是属于一个大的类型题目,我们可以使用栈、对象着手解决,但是解决问题的同时,我们尽可能的需要降低运算的复杂度。