20.有效的括号
题目描述
给定一个只包括 ’(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
Given a string s containing just the characters ’(’, ’)’, ’{’, ’}’, ’[’ and ’]’, determine if the input string is valid.
An input string is valid if:
- Open brackets must be closed by the same type of brackets.
- Open brackets must be closed in the correct order.
解题方法
方法一: 栈
-
思路:
-
遇到左括号时,后续遍历需要一个相同类型的右括号才可以使其闭合。
-
靠后遇到的左括号需要优先闭合,所以把左括号推入栈顶,遇到右括号需要个相同类型的左括号闭合, 继而去判断左括号类型,如何类型不匹配或者栈里没有左括号,那就直接判定不合法。
-
遍历结束后如果栈里没有元素(左括号),说明之前推进去的左括号都闭合了👏,如果有元素,那就判定不合法
-
-
步骤:
- 创建一个栈
- 扫描字符串
- 遇到左括号 入栈
- 遇到和栈顶括号匹配的右括号 出栈
- 遇到和栈顶括号类型不匹配的 判定不合法
- 最后栈空了就合法,否则不合法
-
复杂度分析:
- 时间复杂度:O(N), s.length
- 空间复杂度:O(N), 栈中字符数量为n, 即s为
(([{((((n个单边符号)
var isValid = function(s) { if (s.length % 2) { return false }
const stack = [] const pairObj = { ')': '(', '}': '{', ']': '[' }
for(let ch of s) { if ([')', '}', ']'].includes(ch)) { if (!stack.length || stack[stack.length - 1] !== pairObj[ch]) { return false } stack.pop() } else { stack.push(ch) } }
return !stack.length};方法二:replace大法
- 思路:有类型一样的括号咱就替了他🎯,替到什么都不剩就是合法的👏
var isValid = function(s) { let len = s.length while (len && len % 2 === 0) { s = s.replace('()', '').replace('{}', '').replace('[]', '') if (s.length === len) { return false } len = s.length } return len === 0};