题干
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法
好像没有什么暴力pj的方法,只能使用栈。
直接贴一个题解,非常清晰,可以说是非常清晰了
这个解法已经十分清晰了,基本只要知道栈的 “先入后出”原则,明白栈顶栈底的概念,进栈出栈的概念就能直接看懂。
class Solution {
public boolean isValid(String s) {
//如果字符串长度为奇数或者长度为0,肯定不对
if(s.length()%2==1||s.length()==0)return false;
//声明一个栈
Stack<Character> stack=new Stack<>();
//遍历
for(char c:s.toCharArray()){
//如果为左括号,则右括号进栈
if(c=='('){
stack.push(')');
}
else if(c=='{')
{
stack.push('}');
}
else if(c=='['){
stack.push(']');
}
//如果不是右括号,则栈顶元素出栈
//因为按照上述遍历方式,顺序遍历到左括号,右括号就进栈的方式,栈里元素正常出栈就是符合结果的标准答案
//到此else if 则必然是遍历到了右括号,而出栈元素就是正确答案,因此,对比即可
//若栈空或者栈内元素出栈与当前右括号不同,则错误
else if(stack.isEmpty()||stack.pop()!=c) {
return false;
}
}
//括号一一对应,遍历完成后,栈应该为空,空 1 对, 非空 0 错
return stack.isEmpty();
}
}
栈操作: POP()出栈 PUSH()进栈