判断括号是否有效
要求
给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
左括号必须以正确的顺序闭合,情况反映在示例四,这种情况返回 false
。我一开始就是没有留意这个情况。
原题:有效的括号
示例
示例 1:
1 | 输入:s = "()" |
示例 2:
1 | 输入:s = "()[]{}" |
示例 3:
1 | 输入:s = "(]" |
示例 4:
1 | 输入:s = "([)]" |
示例 5:
1 | 输入:s = "{[]}" |
思路
最先想到的思路就是既然括号需要正确的顺序闭合,那就直接替换,替换完成以后如果字符串的长度为 0,就说明括号都是有效的
1 | s=s.replace("()", ""); |
因为存在 s = "{[]}"
的情况,这种情况下必须里面的 方括号[]
完成替换后,才能替换外面的 花括号{}
,所以就需要用到循环
1 | class Solution { |
但是效率太低了
执行用时:44 ms, 在所有 Java 提交中击败了 5.87%的用户
内存消耗:41.7 MB, 在所有 Java 提交中击败了 5.01%的用户
解决
遍历给定的字符串 s 时,当遇到一个左括号,我们会期望在后续的遍历中,遇到一个最近的相同类型的右括号将其闭合。
而栈这种数据结构的特点就是先入后出。即遇到左括号入栈,如果括号有效的话,下一个遇到的右括号肯定是与栈顶的左括号对应,此时栈顶的左括号出栈,遍历完所有括号后 stack
为空。
当然为了考虑通用性,这里还是用 map 集合来实现左右括号的对应
1 | // 使用匿名内部类方法赋值 |
完整代码
1 | class Solution { |
本文采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ShiGuang
评论