给定一个只包括 '(' ,')' ,'{' ,'}' ,'[' ,']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
- 输入: "()"
- 输出: true
示例 2:
- 输入: "()[]{}"
- 输出: true
示例 3:
- 输入: "(]"
- 输出: false
示例 4:
- 输入: "(]"
- 输出: false
示例 5:
- 输入: "([)]"
- 输出: false
解答:利用栈结构
解题思路: 将字符串中的字符依次入栈,遍历字符依次判断:
- 首先判断该元素是否是 { 、 ( 、 [ ,直接入栈
- 否则该字符为 } 、 ) 、 ] 中的一种,如果该字符串有效,则该元素应该与栈顶匹配,例如栈中元素有 ({, 如果继续遍历到的元素为 ), 那么当前元素序列为 ({) 是不可能有效的,所以此时与栈顶元素匹配失败,则直接返回 false ,字符串无效
当遍历完成时,所有已匹配的字符都已匹配出栈,如果此时栈为空,则字符串有效,如果栈不为空,说明字符串中还有未匹配的字符,字符串无效
画图帮助理解一下:
代码实现:
- const isValid = function(s) {
- let map = {
- '{': '}',
- '(': ')',
- '[': ']'
- }
- let stack = []
- for(let i = 0; i < s.length ; i++) {
- if(map[s[i]]) {
- stack.push(s[i])
- } else if(s[i] !== map[stack.pop()]){
- return false
- }
- }
- return stack.length === 0
- };
时间复杂度:O(n)
空间复杂度:O(n)