题目:
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
package leetcode.Stack;
import java.util.Stack;
public class Easy_20_ValidParentheses {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s="([)]";
Easy_20_ValidParentheses vp=new Easy_20_ValidParentheses();
Solution solution=vp.new Solution();
System.out.println(solution.isValid(s));
}
class Solution {//注意例4为false,所以只用一个栈就可以了
/*
* 2020/4/13 21:20
* 执行用时 :2 ms, 在所有 Java 提交中击败了88.81%的用户
* 内存消耗 :37.6 MB, 在所有 Java 提交中击败了5.04%的用户
*/
public boolean isValid(String s) {//已通过
if(s.length()==0)return true;//当字符为空,直接返回true
if(s.length()%2==1)return false;//当字符串为奇数,一定无法对应,返回false
Stack<Character> stack=new Stack<Character>();
for(char c:s.toCharArray()){
if('('==c||'['==c||'{'==c){//当当前字符为(【{时,直接入栈
stack.push(c);
}else{//当不为(【{时,即为)】}时
if(stack.isEmpty()){//如果栈中没有元素,即还没出现(【{就出现了)】},返回false
return false;
}else{//栈中有元素,将栈顶元素与当前元素对比,如果一样则出栈,不一样返回false
char topC=stack.peek();//获得栈顶
if(')'==c&&topC=='('){
stack.pop();
}else if(']'==c&&topC=='['){
stack.pop();
}else if('}'==c&&topC=='{'){
stack.pop();
}else return false;
}
}
}
if(!stack.isEmpty()){//全部数据走完后如果还有数据,例[(){,{[[]返回false
return false;
}
return true;
}
}
}