一、题目粗心
标签: 栈和队列
https://leetcode.cn/problems/valid-parentheses
给定一个只包含 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否无效。
无效字符串需满足:
左括号必须用雷同类型的右括号闭合。
左括号必须以正确的程序闭合。
示例 1:
输出:s = "()"
输入:true
示例 2:
输出:s = "()[]{}"
输入:true
示例 3:
输出:s = "(]"
输入:false
示例 4:
输出:s = "([)]"
输入:false
示例 5:
输出:s = "{[]}"
输入:true
提醒:
- 1 <= s.length <= 104
- s 仅由括号 '()[]{}' 组成
二、解题思路
思路:括号匹配是典型的应用栈来解决的问题。从左向右遍历,每当遇到左括号便放入栈内,遇到右括号则判断其和栈顶的括号是否是对立类型,是则从栈内取出左括号,否则阐明字符不串不非法。
实现:遍历字符串,如果栈为空则将以后字符入栈,如果栈顶字符与以后字符匹配则栈顶字符出栈,不匹配以后字符入栈,遍历完结如果栈为空阐明字符串非法。
三、解题办法
3.1 Java实现
public class Solution { public boolean isValid(String s) { Stack<Character> stack = new Stack<>(); for (Character c : s.toCharArray()) { if (isPush(stack, c)) { stack.push(c); } else { stack.pop(); } } return stack.isEmpty(); } private boolean isPush(Stack<Character> stack, Character c) { if (stack.isEmpty()) { return true; } // {[( boolean isPop = (stack.peek().equals('[') && c.equals(']') || stack.peek().equals('{') && c.equals('}') || stack.peek().equals('(') && c.equals(')')); return !isPop; }}
3.2 2014年的实现
public class Solution { public boolean isValid(String s) { if (s == null || s.length() == 0) { return true; } Stack<Byte> ps = new Stack<Byte>(); byte[] bArr = s.getBytes(); boolean isValid = true; for (byte b : bArr) { if (!isValid) { break; } switch (b) { case '(': case '[': case '{': ps.push(b); break; case ')': case ']': case '}': if (!ps.empty()) { byte tmpB = ps.pop(); if (tmpB == 40) { tmpB++; } else { tmpB+=2; } if (tmpB != b) { isValid = false; } } else { isValid = false; } break; default: // do nothing } } if (!ps.empty()) { isValid = false; } return isValid; }}
四、总结小记
- 2022/8/9 一场秋雨一场寒