刷题笔记 数据结构 栈 Leetcode20. 有效的括号 赵海波 2024-06-09 2024-06-14
20. 有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
示例 2:
1 2 >输入:s = "()[]{}" >输出:true
示例 3:
提示:
1 <= s.length <= 104
s
仅由括号 '()[]{}'
组成
解法一:使用堆栈
这个思考的过程其实就是栈的实现过程。因此我们考虑使用栈,当遇到匹配的最小括号对时,我们将这对括号从栈中删除(即出栈),如果最后栈为空,那么它是有效的括号,反之不是。
细节在于使用哈希表进行快速匹配,同时可以排除长度不为2的倍数的所有字符串。
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) { if (s.length() % 2 ==1 ){ return false ; } Stack<Character> temp = new Stack <>(); Map<Character, Character> map = new HashMap <>(); map.put('}' ,'{' );map.put(')' ,'(' );map.put(']' ,'[' ); for (int i = 0 ; i < s.length();i ++){ char cur = s.charAt(i); if (cur == '(' || cur =='{' ||cur == '[' ){ temp.push(cur); }else { if (temp.isEmpty())return false ; if (temp.pop() != map.get(cur)){ return false ; } } } if ( temp.isEmpty())return true ; return false ; } }
解法二:暴力法
使用内建函数进行匹配,将返回后的字符串进行比较
1 2 3 4 5 6 7 8 class Solution { public boolean isValid (String s) { while (s.contains("()" ) || s.contains("[]" ) || s.contains("{}" )) { s = s.replace("()" , "" ).replace("[]" , "" ).replace("{}" , "" ); } return "" .equals(s); } }