1.题目
https://leetcode.cn/problems/valid-parentheses/
2.解法
2.1 解法一:利用栈
思路
是使用一个栈来存储左括号,然后遍历字符串中的每个字符,
- 如果是左括号就入栈,
- 如果是右括号就出栈并和栈顶元素比较是否匹配。
- 如果不匹配或者栈为空,就说明字符串不是有效的括号。
最后遍历完字符串后,还要检查栈是否为空,如果不为空,也说明字符串不是有效的括号。
代码逻辑
使用栈
- 创建一个空栈,用来存储左括号
- 遍历字符串中的每个字符
- 如果是左括号,就将其入栈
- 如果是右括号,就将栈顶元素出栈,并判断是否和右括号匹配
- 如果不匹配或者栈为空,就返回false,表示字符串不是有效的括号
- 遍历完字符串后,检查栈是否为空
- 如果不为空,就返回false,表示字符串不是有效的括号
- 如果为空,就返回true,表示字符串是有效的括号
具体实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // 解法1:使用栈 class Solution { public boolean isValid(String s) { Stack<Character> stack = new Stack<>(); for ( char c : s.toCharArray()) { // 遇到左括号就入栈 if (c == '(' || c == '[' || c == '{' ) { stack.push(c); } else { // 遇到右括号就出栈并比较 if (stack.isEmpty()) return false ; char top = stack.pop(); if (c == ')' && top != '(' ) return false ; if (c == ']' && top != '[' ) return false ; if (c == '}' && top != '{' ) return false ; } } // 最后判断栈是否为空 return stack.isEmpty(); } } |
2.1 解法二 :利用栈+使用ASCII码
思路
这个解法利用了栈的先进后出的特性,遇到左括号就进栈,遇到右括号就出栈配对。它还用了ASCII码的差值来判断是否是匹配的括号。
思路是利用ASCII码的特性,如果两个括号是匹配的,那么它们的ASCII码值之差不会超过2。所以也是使用一个栈来存储左括号,然后遍历字符串中的每个字符,如果是左括号就入栈,如果是右括号就出栈并和栈顶元素比较它们的ASCII码值之差是否小于等于2。如果不是或者栈为空,就说明字符串不是有效的括号。最后遍历完字符串后,还要检查栈是否为空,如果不为空,也说明字符串不是有效的括号。
代码逻辑
使用ASCII码
- 创建一个空栈,用来存储左括号
- 遍历字符串中的每个字符
- 如果是左括号,就将其入栈
- 如果是右括号,就将栈顶元素出栈,并计算它们的ASCII码值之差
- 如果差值大于2或者栈为空,就返回false,表示字符串不是有效的括号
- 遍历完字符串后,检查栈是否为空
- 如果不为空,就返回false,表示字符串不是有效的括号
- 如果为空,就返回true,表示字符串是有效的括号
具体实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // 解法2:使用ASCII码 class Solution { public boolean isValid(String s) { Stack<Character> stack = new Stack<>(); for ( char c : s.toCharArray()) { // 遇到左括号就入栈 if (c == '(' || c == '[' || c == '{' ) { stack.push(c); } else { // 遇到右括号就出栈并比较ASCII码差值 if (stack.isEmpty()) return false ; char top = stack.pop(); if (Math.abs(c - top) > 2 ) return false ; } } // 最后判断栈是否为空 return stack.isEmpty(); } } |
2.2 解法三
还有一些其他解法,都差不太多
它用了HashMap来保存左右括号的配对关系,然后用栈来判断是否匹配:
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 | class Solution { public boolean isValid(String s) { //创建一个HashMap,存储左右括号的配对关系 HashMap<Character, Character> map = new HashMap<>(); map.put( ')' , '(' ); map.put( ']' , '[' ); map.put( '}' , '{' ); //创建一个栈,存储左括号 Stack<Character> stack = new Stack<>(); //遍历字符串 for ( int i = 0 ; i < s.length(); i++) { //获取当前字符 char c = s.charAt(i); //如果是右括号,就判断栈是否为空,以及栈顶元素是否与当前元素匹配 if (map.containsKey(c)) { if (stack.isEmpty() || stack.pop() != map.get(c)) { return false ; } } else { //如果是左括号,就入栈 stack.push(c); } } //遍历完后,判断栈是否为空,如果为空,说明所有的括号都匹配了,返回true return stack.isEmpty(); } } |
3.总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2019-04-10 web.xml中<load-on-start>n</load-on-satrt>作用
2019-04-10 JavaWeb中filter的详解及应用案例
2019-04-10 Tomcat的简单归纳总结
2019-04-10 Tomcat 配置详解和优化
2019-04-10 深入理解Tomcat
2019-04-10 Tomcat启动过程原理详解
2019-04-10 Tomcat的目录结构详细介绍(超全)