问题描述
括号匹配可以说是栈应用的经典问题了 但是今天刷到了一个很巧妙的方法(只是提供另一种思路)
有点兴奋 想记录下来
先说一下以前的解法吧
解法一
栈——括号匹配问题一共就有三种情况
(1)右括号数量多
(2)左右括号不匹配
(3)左括号数量多
首先: 建栈
依次扫描字符串内字符,如果是左括号——将该字符入栈
如果是右括号,出栈判断是否匹配
此时栈是空的返回false 说明右括号多了
不匹配返回false 匹配则继续
如果扫到其他字符返回false(视情况而定 你也可以选择扫到括号以外字符就略过直接扫下一个))
直到循环结束
如果栈不为空 说明左括号多了返回false
若此时栈也空了 返回true
上面的就相当于粗糙的伪代码了吧(这里手懒 就先不打了)【手动狗头】
解法二
任然是上述三种情况 (1)(2)(3)
只是对问题的处理不同
依次扫描字符串内字符
如果是左括号——将与其对应的右括号入栈
如果是右括号——判断和出栈字符是否相同
不相同或栈空返回false
直到循环结束
如果栈不为空 说明左括号多了返回false
若此时栈也空了 返回true
与解法一主要不同是:在面对多类括号问题时()、[]、{} 扫描到右括号后,出栈比较不用再分别判断了
写的行数能少一点
不说废话 直接上代码通俗易懂
import java.util.*;
import java.util.Stack;
public class Solution {
public boolean isValid (String s) {
Stack<Character> sta = new Stack<>();//建栈
for(char r : s.toCharArray()){ //遍历字符串
if(r=='(') sta.push(')');
else if(r=='[') sta.push(']');
else if(r=='{') sta.push('}');
else if(sta.isEmpty()||sta.pop()!=r)
return false; //右括号多了
//这里没有处理异常字符
//可以在前面加上 if(当前字符不等于()、[]、{}) continue; 之类的
}
return sta.isEmpty(); //左括号多的情况 和上面说的意思一样的
}
}