本文最后更新于:2024年6月7日 中午
题目详情
原题链接点我
给定一个只包括'(',')','{','}','[',']'
的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
1 2 3 4 5 6 7 8 输入:s = "()" 输出:true 输入:s = "()[]{}" 输出:true 输入:s = "(]" 输出:false
解题思路
这里要用到栈的性质了
现在我们有一个数组
但栈的性质是先进来的先出
有两种操作 进栈和出栈
也就是 我添加了数字1,2,3
我出栈是3 刚才进来的被踢出去了 所以这个也能拿来检验有效的括号
现在我们来模拟一下
添加一个左(小)括号 进栈
轮到右小括号的时候 这个时候我们出栈
如果是右小括号对应的左小括号 则是一个合理的括号
再继续模拟一下错误
情况
进来了一个左小括号
和左中括号
这时候来一个右小括号)
出栈
但发现是[
所以这不是一个合理的括号
那接下来可以开始写代码了 先创建一个数组 和 字典 (查询括号对应的另一半)
1 2 a = [] i = {")" :"(" ,"}" :"{" ,"]" ,"[" }
开始遍历for循环 左括号进栈 右括号出栈 以及判断
1 2 3 4 5 6 7 for q in s: if q in ["(" ,"[" ,"{" ]: a.append(q) else : if a.pop() != i[q]: return False return True
但题目数据范围还有1 也就意味着有 一个字符的测试示例
一个字符是构不成括号 因此要特殊判断
最终代码为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 class Solution : def isValid (self, s: str ) -> bool : res = [] i = {")" :"(" ,"]" :"[" ,"}" :"{" } for q in s: if q in ["(" ,"{" ,"[" ]: res.append(q) else : if not res: return False if res.pop() != i[q]: return False if res: return False return True
但这个特殊判断我写的太麻烦 所以优化一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution : def isValid (self, s: str ) -> bool : res = ["?" ] i = {")" :"(" ,"]" :"[" ,"}" :"{" } for q in s: if q in ["(" ,"{" ,"[" ]: res.append(q) else : if res.pop() != i[q]: return False if len (res) != 1 : return False return True
示例代码
Python3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class Solution : def isValid (self, s: str ) -> bool : res = ["?" ] i = {")" :"(" ,"]" :"[" ,"}" :"{" } for q in s: if q in ["(" ,"{" ,"[" ]: res.append(q) else : if res.pop() != i[q]: return False if len (res) != 1 : return False return True
C++
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 31 class Solution {public : bool isValid (string s) { int n = s.size (); if (n % 2 == 1 ) { return false ; } unordered_map<char , char > pairs = { {')' , '(' }, {']' , '[' }, {'}' , '{' } }; stack<char > stk; for (char ch: s) { if (pairs.count (ch)) { if (stk.empty () || stk.top () != pairs[ch]) { return false ; } stk.pop (); } else { stk.push (ch); } } return stk.empty (); } };
PHP
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 31 class Solution { /** * @param String $s * @return Boolean */ function isValid($s) { if (strlen($s)==1 ){return False ;} $a = array("?" ); $b = array(); $b[")" ] = "(" ; $b["}" ] = "{" ; $b["]" ] = "[" ; for ($i = 0 ; $i < strlen($s); $i++){ if ($s[$i] == "{" || $s[$i] == "(" || $s[$i] == "[" ){ array_push($a,$s[$i]); }else { if (array_pop($a)!= $b[$s[$i]]){ return False ; } } } if (count($a) == 1 ){ return True ; }else { return False ; } } }
感谢观看