本文最后更新于:2022年9月5日 晚上
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
示例 2:
示例 3:
示例 4:
示例 5:
Solution
参考:《算法小抄》5.9
class Solution : def isValid (self, s: str ) -> bool: if not s: return True stack = [] hashC = {')' :'(' , ']' :'[' , '}' :'{' } for c in s: if c in {'(' ,'[' ,'{' }: stack.append(c) elif stack and hashC[c]==stack[-1 ]: stack.pop() else : return False return len (stack)==0
cpp
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 class Solution {public : bool isValid (string s) { if (!s.size()) return true ; if (s.size()%2 ==1 ) return false ; stack <char > stack ; unordered_map <char ,char > mp = { {')' , '(' }, {']' , '[' }, {'}' , '{' } }; for (char c: s){ if (mp.find(c) != mp.end()){ if (stack .empty() || stack .top()!=mp[c]) return false ; else stack .pop(); } else stack .push(c); } return stack .empty(); } };
参考:系统中处处都是栈的应用
在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Solution {public : bool isValid (string s) { stack <int > st; for (int i = 0 ; i < s.size(); i++) { if (s[i] == '(' ) st.push(')' ); else if (s[i] == '{' ) st.push('}' ); else if (s[i] == '[' ) st.push(']' ); else if (st.empty() || st.top() != s[i]) return false ; else st.pop(); } return st.empty(); } };
java
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 class Solution { public boolean isValid (String s) { int len = s.length(); if (len % 2 == 1 ) { return false ; } Deque<Character> stack = new LinkedList<>(); for (int i = 0 ; i < len; ++i) { char ch = s.charAt(i); if (ch == '(' ) { stack.push(')' ); } else if (ch == '{' ) { stack.push('}' ); } else if (ch == '[' ) { stack.push(']' ); } else if (stack.isEmpty() || stack.peek() != ch) { return false ; } else { stack.pop(); } } return stack.isEmpty(); } }