给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
示例 2:
示例 3:
示例 4:
示例 5:
解题思路
这是一道经典的栈应用题目。核心思想是:
- 遇到左括号就入栈
- 遇到右括号就检查栈顶元素是否匹配
- 最后检查栈是否为空
方法一:栈解法
时间复杂度 O(n)、空间复杂度 O(n)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
var isValid = function(s) { const stack = []; const bracketMap = { ')': '(', '}': '{', ']': '[' }; for (let char of s) { if (char === '(' || char === '{' || char === '[') { stack.push(char); } else { if (stack.length === 0 || stack.pop() !== bracketMap[char]) { return false; } } } return stack.length === 0; };
|
方法二:优化版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| var isValid = function(s) { const stack = []; const pairs = { '(': ')', '{': '}', '[': ']' }; for (let char of s) { if (pairs[char]) { stack.push(char); } else { if (stack.length === 0 || pairs[stack.pop()] !== char) { return false; } } } return stack.length === 0; };
|
方法三:使用数组模拟栈
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| var isValid = function(s) { const stack = []; for (let i = 0; i < s.length; i++) { const char = s[i]; switch (char) { case '(': case '{': case '[': stack.push(char); break; case ')': if (stack.pop() !== '(') return false; break; case '}': if (stack.pop() !== '{') return false; break; case ']': if (stack.pop() !== '[') return false; break; } } return stack.length === 0; };
|
解题要点
- 栈的应用:这是栈数据结构的经典应用场景
- 括号匹配:需要检查左右括号的类型和顺序
- 边界情况:
- 空字符串返回 true
- 只有左括号或右括号的情况
- 括号不匹配的情况
- 时间复杂度:O(n),每个字符只遍历一次
- 空间复杂度:O(n),最坏情况下所有字符都是左括号
面试要点
- 高频考点:这道题是面试中的高频题目,考察栈的应用
- 代码简洁性:面试中要写出简洁清晰的代码
- 边界处理:要注意各种边界情况的处理
- 时间复杂度:能够分析时间复杂度和空间复杂度
相关题目
最后更新: 2025-01-24